对问题的描述:
经常会遇到一些朋友,我明明是正确输入中文,为什么我在另一台电脑上查询却有混乱实际上,这是数据库具有字符集转换的问题。
以下是测试来描述具体情况:

1。环境
数据库字符集:
连接到Oracle数据库11g企业版发布11.2.0.1.0
连接史葛
SQL >选择*从database_properties哪里property_name = 'nls_characterset;
property_name property_value描述
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nls_characterset zhs16gbk字符集
Oracle数据库中的客户服务端字符集:
在注册表中:nls_lang =简化chinese_china.zhs16gbk,如下图:
oracle所在的操作系统的字符集:
微软的Windows版本6.1.7601 } {
版权所有(c)2009微软公司。保留所有权利。
C:用户安迪> CHCP
活动代码页:936
中国-简体中文(GB2312)

2。测试
字符集如下所示:
Oracle数据库字符集:zhs16gbk
Oracle数据库客户端字符集:zhs16gbk
操作系统的字符集:中国-简体中文(GB2312)
输入测试数据:
SQL >插入tab_indx
2个值(1,汉字输入的字符集测试','中国输入测试,系统日期);
1插入行
字符集没有被修改来测试数据的真实性:
SQL >选择*从tab_indx在TID = 1;
sysdt tname tdesc tid
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1汉字输入字符集测试汉语输入测试2012 12 30
显示正常,
现在我修改设置在客服端的字符:UTF8
和注册表:nls_lang =简化chinese_china.utf8
字符集如下所示:
Oracle数据库字符集:zhs16gbk
Oracle数据库客户端的字符集utf8
操作系统的字符集:中国-简体中文(GB2312)
现在查询刚才输入的数据。
SQL >选择tdesc tname,从tab_indx;
tdesc tname
----------------------------------------------------------------------------------------------------------------------------------------------------------------
检查出的数据不在正常的现实存在,因为这些汉字在zhs16gbk编码格式,但是你看看服务结束后根据Oracle编码(utf8)转换,变成UTF8编码格式,但是操作系统是简体中文(GB2312)操作系统,所以编码格式数据的UTF8,简体中文(GB2312)编码格式的数据,结果出现乱码,
现在我要插入另一段数据。
SQL >插入tab_indx
2个值(1,'utf8,汉字输入字符集的测试,输入测试,系统日期);
1插入行
重新查询:
SQL >选择tdesc tname,从tab_indx;
tdesc tname
----------------------------------------------------------------------------------------------------------------------------------------------------------------
发现新插入的数据也有混沌码,但代码与刚才的值不一样,为什么呢
因为输入的是简体中文,中文(GB2312)编码格式,当Oracle数据库客户端根据编码格式的数据库,Oracle数据库,Oracle数据库客户端是UTF8编码格式,数据库的编码格式(zhs16gbk)是不一样的,它把字符集是UTF8 --> zhs16gbk,所以简体中文(GB2312)编码格式数据编码为UTF8,zhs16gbk格式的数据,这是错误的,检查出的自然转换回号
(最初,我们需要修改Oracle数据库的字符集)。这种情况暂时不进行测试)。这里我们正在修改oracle客户端的字符集。
在注册表中:nls_lang =简化chinese_china.zhs16gbk
字符集如下所示:
Oracle数据库字符集:zhs16gbk
Oracle数据库客户端字符集:zhs16gbk
操作系统的字符集:中国-简体中文(GB2312)
重新查询:
SQL >选择tdesc tname,从tab_indx;
tdesc tname
----------------------------------------------------------------------------------------------------------------------------------------------------------------
汉字输入字符集测试汉语输入测试
UTF8中文输入测试
结果发现,第一个汉字是正常的,但第二个汉字再次改变,不一样的最后一个代码
虽然没有代码格式转换,但最后一次存储数据时,它已经存储在错误的编码格式中,所以显示它是不正确的。
事实上,有几个测试。由于当地环境的限制,你可以尝试其它的情况下的测试,如:设置数据库的字符UTF8,然后改变字符集客户服务终端影响汉字的输入输出。
基于以上测试和我自己的分析,现在总结如下:
1。数据库查询数据,是oracle数据库字符集、oracle客户端字符集、操作系统字符集结果的共同作用。
2、oracle存储数据和查询数据由Oracle数据库的字符集和Oracle客户服务的字符集进行转换,显示数据由操作系统的字符集决定。
三.为了避免随机代码,Oracle客户端的字符集必须设置为操作系统的同一字符集。