- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搞懂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
Typ=1 Len=4 CharacterSet=AL32UTF8: d6,d0,b9,fa
1
Typ=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)
Typ=96 Len=3 CharacterSet=AL32UTF8: e4,b8,ad --字符“中” ,和上面直接从数据库中读取存储的字符编码一致。
SQL select dump(国,1016) from dual;
DUMP(国,16)
Typ=96 Len=3CharacterSet=AL32UTF8: e5,9b,bd --字符“国” ,和上面直接从数据库中读取存储的字符编码一致。
如果使用session 2直接对着两个字符进行测试,一样会得到相同的结果(笔者已经做过测试,这里为了避免冗长,删掉了).
让我们重新来理一下思路,并提出几个问题:
1:为什么显示为相同的字符,存储到数据库中却变成了不同的编码?
2:我们在向数据库中插入数据的时候,oracle究竟做了些什么?
3:操作系统字符集,客户端字符集,数据库字符集究竟是什么关系?
带着这些疑惑,让我们接着做实验,所有的疑团和猜测都会在试验中得以验证。
我的思路是,先取得测试环境的相关参数。
1:windows字符集(codepa
您可能关注的文档
最近下载
- 幼儿园伙食培训.pptx VIP
- 新型城镇化背景下乡镇行政管理体制改革的出路.docx
- 第15课 无人机创意飞行-九年级信息科技(浙教版2023).ppt
- c guiqt4编程(第二版)(中文高清pdf扫描版) 随书源码.pdf
- 工贸行业企业岗位安全生产责任清单(参考模板2.0).docx VIP
- 城市社区公共文化服务建设问题及对策研究——以南京市彩霞社区为例.docx
- 篮球运动竞赛的组织与编排工作教案.pdf VIP
- 人教版七年级上册数学期末动点问题压轴题专题训练(含答案).docx VIP
- 包装行业的包装设计与安全标准培训.pptx
- 感恩教师,伴我成长——教师节大会学生国旗下的讲话稿.docx VIP
文档评论(0)