Archive for February 20th, 2008

关于UTF8字符集的话题

Wednesday, February 20th, 2008

UTF8字符集几乎包含了世界上所有的语言字符,应用程序需要在同一页面显示多种语言时,我们往往会选择将数据库的字符集定为UTF8,然而,这个字符集在使用的时候,会有一些困惑          
          1.客户段NLS_LANG与数据库一致的时候,数据存取不需要转码,所以多语言问题只要NLS_LANG=UTF8就搞定
           NLS_LANG保持与数据库一致,oracle客户段软件确实不会对数据进行转码,但他更不会关心你输入的数据格式是否真的和数据库匹配,比如我windows的语言区域是简体中文,对应的字节编码是zhs16gbk,那么他就会把zhs16gbk编码原封不动的存入utf8数据库,明明想要馒头的你却给我砖头,但我还是通吃,只不过日后你再想把这部分东西当馒头用,就会遇到麻烦
[oracle@japdev_new ~]#export NLS_LANG=AMERICAN_AMERICA.UTF8
japan@JAPDEV>select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
—————————————————————-
UTF8
japan@JAPDEV>insert into myword values(’垃圾’);
1 row created.
japan@JAPDEV>select dump(word) from myword;
DUMP(WORD)
——————————————————————————————————————————————————
Typ=1 Len=4: 192,172,187,248
1 row selected.
现在找个zhs16gbk的数据库,存入同样的数据
oracps@:/home/oracps>export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
SQL> select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
—————————————————————-
ZHS16GBK
SQL> insert into myword values(’垃圾’);
1 row created.
SQL> select dump(word) from myword;
DUMP(WORD)
——————————————————————————–
Typ=1 Len=4: 192,172,187,248
可以看到两个的编码都是ZHS16GBK,因为我们的WINDOWS直接输入字符,他本身不是UTF8格式的,这个时候你必须告诉ORACLE,你在用他的子集与他交互,转码是必须的
[oracle@japdev_new ~]#export NLS_LANG=AMERICAN_AMERICA.ZHS16GBKjapan@JAPDEV>select value from v$nls_parameters where PARAMETER = ‘NLS_CHARACTERSET’;
VALUE
———————————————————————————–
UTF8
japan@JAPDEV>insert into myword [...]

阿里巴巴DBA出品