Oracle的字符集转换的一个小测试

    对于Oracle的字符集, 一直不是很明白的, 除了在出道的当年(98年)范过一次这方面的错后, 到还没有第二次, 算是走运了. 下面来做一个小实验, 加深一下理解, 我测试用的数据库端是UTF8格式的, 测试用的表结构如下, 第一个字段用于记录NLS_LANG的设置, 第二列则为相同的值.

create table t_charset(col1 varchar2(10), col2 varchar2(20));

    接下来, 我在Windows在命令窗口(cmd.exe)中更改NLS_LANG的设置为中文, 然后插入一条记录.

set NLS_LANG=.ZHS16GBK
SQL> insert into t_charset values ('ZHS16GBK','中国');

    接下来更改NLS_LANG的设置为中文, 然后插入另一条记录.

set NLS_LANG=.UTF8
SQL> insert into t_charset values ('UTF8','中国');

    用Oracle的Dump函数来看一下第二个字段在不同设置下的存贮.

SQL> col col2 format a40
SQL> select col1, dump(col2) col2 from t_charset;

COL1       COL2
---------- ----------------------------------------
ZHS16GBK   Typ=1 Len=6: 228,184,173,229,155,189
UTF8       Typ=1 Len=4: 214,208,185,250

    发现NLS_LANG设为ZHS16GBK的, 里面存放是以UTF8格式存的, 而设为UTF8的, 存放格式是中文的, 难道反了吗? 不是, 因为我的Windows机器的区域是中文, 因此在命令行输入文本时, 文本的字符集是中文, 因此NLS_LANG和服务器相同时, 不作转换, 所以存放格式其实是中文, 而设成ZHS16GBK(和机器的区域一致时)Oracle自动作了转换, 其存贮格式就是UTF8的. 当客户端环境变量设成UTF8时, 中国的用户输入时存成了中文字符集, 其他国家的用户输入时则存成了其他字符集.

    在进行字符集转换时, 我们可以写一个角本(如Perl)程序, 将值在UTF8的环境下取出来, 然后变更环境变量设置, 再将值更新回去. 当我用iconv工具来进行文件的字符集转换时, 如果源文件和指定的源字符集不一样时, iconv会报错. Oracle的csscan却不是用来进行字符集转换的, 而是用来找出那些表中的那些记录还没有被成功转换, 原理是iconv转换报错是一样的.

留言 (1)

字符集复杂,搞不明白~

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • Would you please open the door for me?
  • 请你帮忙开个门好吗?
  • May I ask you a question?
  • 我能问你个问题吗?
  • Please give me a hand.
  • 请帮我个忙.
  • Could you do me a favor?
  • 能请你帮个忙吗?
  • Would you help me remove the refrigerator?
  • 能帮忙移一下冰箱吗?