--------------------------------------------
Ty p=96 Len=3 CharacterSet=AL32UTF8: e4,b8,ad -- 字符 “ 中 ” , 和上面直接从数据库中读取存储 的
字符编码一致。
SQL> select dump(' 国 ',1016) from dual;
DUMP(' 国 ',16)
--------------------------------------------
Ty p=96 Len=3CharacterSet=AL32UTF8: e5,9b,bd -- 字符 “ 国 ” ,和上面直接从数据库中读取存储的
字符编码一致。
如果使用 session 2 直接对着两个字符进行测试,一样会得到相同的结果(笔者已经做
过测试,这里为了避免冗长,删掉了) .
让我们重新来理一下思路,并提出几个问题:
1 :为什么显示为相同的字符,存储到数据库中却变成了不同的编码?
2 :我们在向数据库中插入数据的时候, oracle 究竟做了些什么?
3 :操作系统字符集,客户端字符集,数据库字符集究竟是什么关系?
带着这些疑惑,让我们接着做实验,所有的疑团和猜测都会在试验中得以验证。
我的思路是,先取得测试环境的相关参数。
1 : windows 字符集 (codepage)
我们使用 chcp 命令来获得 windows 使用的字符集
c:\chcp
活动的代码页
:
936
通过 oracle 的官方文档阅读,我们可以将它等同于 ZHS16GBK 字符集(在安装 oracle
时, oracle 会找到安装平台的字符集,并默认将对应的字符集设置成与它相同,在这里, 数
据库默认的字符集本身应该是 ZHS16GBK, 但我强制将它修改为 AL32UTF8
) 。
所以现在我们可以认为,我们使用的操作系统是 ZHS16GBk 字符集,那么我们在这个
环境下输入的字符(也可以说是显示的字符,用的就是这个字符集的编码) 。
让我们继续讨论问题。
我们现在要讨论一下客户端字符集究竟是用来做什么的。
我们知道,很多字符集都有自己的编码方式,换句话说,相同的字符,在不同的字符 集
里对应的编码可能是不一样的。
客户端的字符集就是为了让数据库知道我们传递过去的字符是属于那种字符集, 以便 于
oracle 在存储字符时做相应的编码映射。
相关文档
评论