问题表述:
VB连接Oracle 11g数据库,取出的数据出现中文乱码,英文正常。
环境如下:
服务端:Oracle11g,Radhat,英文操作系统,数据库字符集 AMERICAN_AMERICA.ZHS16GBK
客户端:MSDAORA驱动包,XP中文,系统字符集GBK,VB6.0汉化版,安装有Oracle11g Client,注册表中在Oracle下有NLS_LANG键,键值为AMERICAN_AMERICA.ZHS16GBK
连接语句:
Conn.ConnectionString = "Provider=MSDAORA.1;Password=*****;User ID=******;Data Source=dbcenter;Persist Security Info=True"
获取数据后,中文显示为“?????”
解决方法:
1、查看服务器端数据库字符集
select userenv('language') from dual;
获得结果为 AMERICAN_AMERICA.ZHS16GBK
2、在XP系统环境中增加变量NLS_LANG,赋值AMERICAN_AMERICA.ZHS16GBK
即:NLS_LANG = AMERICAN_AMERICA.ZHS16GBK
3、保存后重启计算机或注销计算机
4、重新打开VB工程,无需修改代码,获取中文数据正常。
注意:
1、在没有配置环境变量的情况下,使用pl/sql或者navicat均可以正常获取中文数据,无乱码现象。
2、只有VB6.0出现该问题,配置NLS_LANG变量后,正常读取中文数据。
3、在VB连接语句中加入Unicode=True并不生效,无法解决中文乱码问题。
分析现象后,个人认为,pl/sql、navicat等客户端会读取注册表中Oracle的NLS_LANG键值,而VB在使用MSDAORA驱动访问Oracle时,会读取系统环境变量中的NLS_LANG参数,如果没有该参数,则会出现中文乱码问题,而英文显示正常,具体用的何种编码来解释获取的数据,尚未查明。