背景
2022-04-28,由于数据库存的都是简体数据,但是资料导出需要繁体,要给别人看。所以只好自己探索一下,至于为什么不用代码,就是想试试数据库,实在不行,我就回去用代码写。
准备工作
- 数据库Oracle 12
- 操作数据库的工具Dbeaver
参考文章
Oracle Convert()函数_w3cschool
求助数据的简繁转换(convert的深入问题) - Oracle开发 - ITPUB论坛-专业的IT技术社区
Oracle中文简繁体转换函数_入秋枫叶的博客-CSDN博客_oracle繁体转简体函数
Oracle中执行存储过程call和exec区别_master_yao的博客-CSDN博客_oracle调用存储过程语句同一个函数不一样的用法---Convert()_Noob_get_a_dream的博客-CSDN博客Oracle中执行存储过程call和exec区别_master_yao的博客-CSDN博客_oracle调用存储过程语句
思路
- 字符集是什么(SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET'; 这个语句可以查看字符集,但我不确定字符集的来源是哪,可能的来源有三个:我电脑的操作系统;部署Oracle服务器的操作系统;Oracle自带)。
- Convert函数的使用
- 写一个Procedure(SP)或者函数来测试一下转换的结果,因为查到的字符集很多,一个个试未免太难了。测试结果你可以选择打印输出,也可以建表存储。我是建表的。
- 执行Sp CALL KILLENTEST();
实践
这下面是我的理解,我没有求证,你们可以再多找找资料。
- SELECT CONVERT ('中国', 'ZHT16MSWIN950') FROM dual; --(string,dest_char)
- SELECT CONVERT ('中国', 'ZHT16MSWIN950','ZHS16GBK') FROM dual; --(string,char,char2)
CREATE OR REPLACE PROCEDURE KILLENTEST
IS
cn_text varchar(100);
LANGUAGE_char varchar(100);
ctn_text varchar(100) ;
BEGIN
DELETE KILLEN_TEST;
FOR x IN (SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET' )
LOOP
cn_text:='中国';
LANGUAGE_char :=x.value;
INSERT INTO KILLEN_TEST(COLUMN1,COLUMN2,COLUMN3,COLUMN4)
SELECT cn_text ,LANGUAGE_char, CONVERT (cn_text, LANGUAGE_char),'CONVERT(string,dest_LANGUAGE_char)' FROM dual;
--1. SELECT cn_text ,LANGUAGE_char, CONVERT (cn_text, LANGUAGE_char),'CONVERT(string,dest_LANGUAGE_char)' FROM dual;
END LOOP;
END KILLENTEST;
CREATE OR REPLACE PROCEDURE KILLENTEST
IS
cn_text varchar(100);
LANGUAGE_char varchar(100);
LANGUAGE_char2 varchar(100);
ctn_text varchar(100) ;
BEGIN
DELETE KILLEN_TEST;
FOR x IN (SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET' AND value LIKE 'ZH%' )
LOOP
cn_text:='中国';
LANGUAGE_char :=x.value;
IF LANGUAGE_char LIKE 'US%' then
CONTINUE;
END IF;
-- INSERT INTO KILLEN_TEST(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,TEST_KEY)
-- SELECT cn_text ,LANGUAGE_char,'', CONVERT (cn_text, LANGUAGE_char),'CONVERT(string,dest_LANGUAGE_char)','1' FROM dual;
FOR y IN (SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET' AND value LIKE 'ZH%')
LOOP
LANGUAGE_char2 :=y.value;
IF LANGUAGE_char2 LIKE 'JA%' OR LANGUAGE_char=LANGUAGE_char2 then
CONTINUE;
END IF;
INSERT INTO KILLEN_TEST(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,TEST_KEY)
SELECT cn_text ,LANGUAGE_char,LANGUAGE_char2, CONVERT (cn_text, LANGUAGE_char,LANGUAGE_char2),'CONVERT(string,LANGUAGE_char,LANGUAGE_char2)','2' FROM dual;
INSERT INTO KILLEN_TEST(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,TEST_KEY)
SELECT cn_text ,LANGUAGE_char,LANGUAGE_char2, CONVERT (cn_text, LANGUAGE_char2,LANGUAGE_char),'CONVERT(string,LANGUAGE_char2,LANGUAGE_char)','3' FROM dual;
COMMIT;
END LOOP;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO KILLEN_TEST(COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,TEST_KEY)
SELECT cn_text ,LANGUAGE_char,LANGUAGE_char2, '','err','4' FROM dual;
END KILLENTEST;
结果
SELECT * FROM KILLEN_TEST kt WHERE COLUMN3 in('中国','中國');
结果1:FAIL
中国 AL24UTFFSS 中国 CONVERT(string,dest_LANGUAGE_char) 2022-04-28 11:51:33
中国 UTF8 中国 CONVERT(string,dest_LANGUAGE_char) 2022-04-28 11:51:33
中国 AL32UTF8 中国 CONVERT(string,dest_LANGUAGE_char) 2022-04-28 11:51:33
结果2:SQL 错误 [12703] [72000]: ORA-12703: 不支持此字符集转换
总结
最终我还是决定不搞数据库了,我还是用代码解决吧,头秃。