ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle 字符集

Oracle 字符集

原创 Linux操作系统 作者:fengjin821 时间:2009-06-24 13:20:26 0 删除 编辑

DEMO:
环境:
OS:WINXP SP2 中文版
ORACLE 10.2.0.1
服务器和客户端在一台机器上
服务器字符集:AL32UTF8 国家字符集 AL16UTF16
客户端字符集: AL32UTF8
以下是在SQLPLUS里面的操作:

SQL> create table test (a varchar2(10));
琛ㄥ凡鍒涘缓銆?
SQL> insert into test values ('我');
宸插垱寤?1
SQL> commit;
鎻愪氦瀹
SQL> select a,dump(a) from test;
A
----------
DUMP(A) --------------------------------------------------------------------------------

Typ=96 Len=2: 206,210

 


可以看到,服务器端和客户端都是UTF8但是显示出来的提示全部是乱码,
在看一下汉字"我"字的编码, 查了一下编码表,在ZHS16GBK里面是 206 98,在UTF8里面是230 136 145,在UTF16里面应该是98 17
但是实际的值是什么呢?实际的编码值是206 210,既不是GBK,也不是UTF8和UTF16的编码,查了一下其它的编码表,最终发现
206 210是GB2312“我”字的编码

 


接着把数据库客户端编码切换成ZHS16GBK,看看会发生什么
SQL> insert into test values(‘我’);
已创建 1 行。
SQL> select a,dump(a) from test;
A
DUMP(A)
我 Typ=96 Len=3: 230,136,145


可以发现,数据库在插入时,准确的把"我"字转换成UTF8的编码,而在显示的时候又转换成了准确的汉字"我",
怎么解释上面这个现象呢?


通过试验我们可以发现OS的字符集实际是GB2312的,但是由于客户端字符集和服务器端字符集一致,所以在上传数据的时候,认为不存在字符集转换,所以就直接把OS的汉字编码上传上去了,这也是我们看到的库中实际存放的是GB2312“我”字编码 206 210的原因,显示的时候同样的方式,认为数据库服务器与客户端字符集编码一致,不存在字符集转换,于是把206 210发到客户端,到了客户端,就正好原封不动的把206 210显示成为了汉字“我”。这也是造成提示乱码的原因,让GBK的窗口去解析UTF8的编码,从而产生乱码。

当客户端字符集是GBK的时候,执行INSERT的时候,ORACLE意识到服务器与客户端字符集不一致,产生一次字符集转换,把“我”字转换成UTF8编码230,136,145存入数据库中,select的时候做反操作,将UTF8转换成GBK编码显示出来。

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13165828/viewspace-607404/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-29

  • 博文量
    191
  • 访问量
    505280