ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 搞懂oracle字符集

搞懂oracle字符集

原创 Linux操作系统 作者:lottery009 时间:2019-06-29 17:36:05 0 删除 编辑
搞懂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 中国
&nbs


从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
Typ
=1 Len=4 CharacterSet=AL32UTF8: d6,d0,b9,fa
1
Typ
=1 Len=6 CharacterSet=AL32UTF8: e4,b8,ad,e5,9b,

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

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

注册时间:2005-10-18

  • 博文量
    34
  • 访问量
    30307