0
搞懂oracle字符集
204
7页
2次
墨值5
oracle
oracle
oracle
oracle
字符
作为一个 ORACLE DBA, 在工作中会经常处理由于字符集产生的一些问题。 是当真
想写一些 这方面的 东西时,突然又没有了头绪。了半天呆,是决定用两个字符集方
的例子作为切入点,不失为一个头绪,不定在实验的过程中,题就会一个接着一个
浮现出来。
现在,让我们切入正题。
我用的数据库是 oracle10.2.0.3, 数据库字符集是 al32utf8
客户端就是同一台机器的 windows xp.
下面是演示的例子:
SQL> drop table test purge;
Table dropped.
SQL> create table test(col1 number(1),col2 varchar2(10));
Table created.
--session 1 设置 zhs16gbk (修 nls_lang 项的 characterset
zhs16gbk 向表中插入两个中文字符。
SQL> insert into test values(1,' 中国 '); --1 session 1 的标记
1 row created.
SQL> commit;
Commit complete.
--session 2 设置客户端字符集 al32utf8 (修改注册表 nls_lang 项的 characterset al32utf8
与数据库字符集相同。 向表中插入两个和 session 1 相同的中文字符。
SQL> insert into test values(2,' 中国 '); --2 session 2 的标记
1 row created.
SQL> commit;
Commit complete.
--session 1
SQL> select * from test;
COL1 COL2
---------- --------------------
2 ??
1 中国
--session 2
SQL> select * from test;
COL1 COL2
---------- ----------
2 中国
1 󳴆
session 1 session 2 的结果中可以看到,相同的字符(注意,我指的是我们看到的
显示为相同的字符) 在不同的字符集输入环境下,显示成了乱码。
zhs16gbk 字符集的客户端,我们看到了 utf8 字符集客户端输入的相同的中文变成了乱
-->col1=2 col2 字段
utf8 字符集客户端,我们看到 zhs16gbk 字符集的客户端输入的中文变成了另外的字符
-->col1=1 col2 字段
从这个例子里, 们好像感觉到出了什么问题, 可能会联想起现实环境中出现的乱码问
问题似乎有了思路, ok ,让我们继续把实验做下去:
--session 1 (或者 session 2 ,在这里无所谓)
SQL> select col1,dump(col2,1016) from test;
COL1
----------
DUMP(COL2,1016)
--------------------------------------------------------------------------------
2
Ty p=1 Len=4 CharacterSet=AL32UTF8: d6,d0,b9,fa
1
Ty p=1 Len=6 CharacterSet=AL32UTF8: e4,b8,ad,e5,9b,bd
我们使用了 dump 函数,结果看起来很明显了,两个完全相同的字符,在不同的字符集
环境下,在数据库中存储成了不同的编码。
对于 ZHS16GBK 的字符集客户端输入的字符 " 中国 "
AL32UTF8 使用了 3 个字节来分
存储一个字符,即:
--e4,b8,ad
--e5,9b,bd
我们也可以分别对这个字符进行验证:
--session 1
SQL> select dump(' ',1016) from dual;
DUMP(' ',16)
of 7

评论

最新上传
暂无内容,敬请期待...
下载排行榜
周榜月榜总榜
近期活动
全部
暂无活动,敬请期待...
相关课程
全部
暂无课程,敬请期待...