UTF8的字符集问题

上一篇 / 下一篇  2008-04-10 16:13:55

查看( 154 ) / 评论( 8 )
环境:
OS:WINXP SP2
ORACLE 10.2.0.1
服务器和客户端在一台机器上
服务器字符集:AL32UTF8 国家字符集 AL16UTF16
客户端字符集:936 GBK

在SQL PLUS下面发生了一件奇怪的事情,

SQL> create table test (a char(10),b nchar(10));

琛ㄥ凡鍒涘缓銆?


SQL> insert into test values ('我','我');

宸插垱寤?1 琛屻?

SQL> commit;

鎻愪氦瀹屾垚銆?

SQL> select a,dump(a),b,dump(b) from test;

A                                                                              
----------                                                                     
DUMP(A)                                                                        
--------------------------------------------------------------------------------
B                                                                              
----------------------------------------                                       
DUMP(B)                                                                        
--------------------------------------------------------------------------------
我                                                                              
Typ=96 Len=10: 206,210,32,32,32,32,32,32,32,32                                 
锟?                                                                              
Typ=96 Len=20: 255,253,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32            
                                                                                
如上所示,有几点搞不太清楚,为什么服务器端和客户端都是UTF8显示出来的提示是乱码,是和OS的语言环境有关系吗?
最奇怪的是"我"字的汉字编码,我查了一下,在ZHS16GBK里面是 206 98   ,在UTF8里面是230 136 145,在UTF16里面应该是98 17
而206 210这个编码是GB2312的编码,为什么回出现这个奇怪的现象?还有在字符集转换的时候,客户端OS字符集起作用吗?

实在有点想不明白,请兄弟们帮帮忙!

TAG:

太极虫的个人空间 kelsoncong 发布于2008-04-10 16:22:19
下面是把客户端字符集转换成ZHS16GBK的情况,

SQL> insert into test values('我','我');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select a,dump(a),b,dump(b) from test;

A                                                                              
--------------------                                                            
DUMP(A)                                                                        
--------------------------------------------------------------------------------
B                                                                              
--------------------                                                            
DUMP(B)                                                                        
--------------------------------------------------------------------------------
我                                                                              
Typ=96 Len=10: 230,136,145,32,32,32,32,32,32,32                                 
我                                                                              
Typ=96 Len=20: 98,17,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32               

由此可见,数据库在插入,准确的把"我"字转换成UTF8和UTF16的编码,而在显示的时候又转换成了准确的汉字"我",
由此说明OS的字符集在ORACLE数据库字符集处理的时候还是起着非常关键的作用的,
但是具体怎么操作的,我现在还搞不清楚,有兄弟知道的,帮忙指导一下
shooterchan发布于2008-04-10 16:33:37
WINXP SP2不支持utf8咯。你可以用第三方软件,比如isqlplus
mihawk发布于2008-04-10 16:33:39
客户端字符集:936 GBK

不知道这个字符集是什么东西.
我一直在跟字符集打交道, 得到的一个心得就是:
客户端的字符集一定要包含你输入的字符, 比如你要输入中文, 就不能在日文字符集里去做, 否则就是乱码.
但是输入日文就可以在中文字符集下做, 因为zhs16gbk字符集中包含了大部分日文.
太极虫的个人空间 kelsoncong 发布于2008-04-10 16:40:10
多谢 shooterchan
TO:mihawk:
呵呵,你说的ZHS16GBK包含的大部分日文是指包含的日文里面的中文显示的部分,但是不能显示日文自身的片甲名和平加名,
我现在的问题实际上牵涉到三个字符集:服务器端,客户端和OS端的关系
太极虫的个人空间 kelsoncong 发布于2008-04-11 08:49:08
有经验的兄弟继续帮忙发表点看法啊
wangfans的个人空间 wangfans 发布于2008-04-11 11:29:58
我猜测哈,你的文件格式的问题。
例如你的文件里面有德文,日文等国外字符,
而你的文件不是UTF-8 的文件格式,
即便你其他设置再正确,
也是乱麻,因为文件级别的信息已经发生了不准确。
wangfans的个人空间 wangfans 发布于2008-04-11 11:36:40
FT,。。。。没看清楚你的意思就发言了,呵呵
不过顺便说句,除了上面列出的之外,文件本身也有限制的。我就吃过亏。。
太极虫的个人空间 kelsoncong 发布于2008-04-11 13:43:12
多谢啊,我后来做了一个简单的整理,不知道对不对,帮忙指正一下,我发了个新贴:飞刀,又见飞刀
我来说两句

(可选)

日历

« 2008-07-09  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 179
  • 日志数: 1024
  • 建立时间: 2008-02-02
  • 更新时间: 2008-04-11

RSS订阅

Open Toolbar