一问题描述
SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器对于那些喜欢窗口界面而不喜欢字符界面的用户该工具相对SQL/PLUS受到了很大的欢迎但从Oracle i以后如果安装Oracle i时选取的是别于英语的字符集对于我们中国通常会选取简体中文字符(ZHSGBK)安装成功后运行SQL Plus WorkSheet程序会出现所有的中文显示以及查询结果均为乱码的情况
二问题分析
最初出现该问题首先怀疑就是安装时字符集设置有问题也就是说没有设置正确的简体中文字符集首先检查数据库字符集在SQL/PLUS中运行下面的SQL语句检查所连接数据库的字符集
SQL> select userenv(language) from dual;
USERENV(LANGUAGE)
SIMPLIFIED CHINESE_CHINAZHSGBK
查询结果发现数据库安装时所选字符集为简体中文ZHSGBK说明安装时字符集设置完全正确第二步开始怀疑是用户客户端字符集问题检查客户端注册表打开注册表编辑程序(RegEdit)在HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG发现Oracle客户端字符集为AMERICAN_AMERICAZHSGBK设置也完全正确可以排除是客户端字符集设置错误的问题同时还有一个现象就是在同一个客户端机器上SQL/PLUS中的查询字符集显示完全正常这也说明不是字符集设置问题而是系统程序SQL/Plus Worksheet的问题
在Oracle i以前的版本中从来没有出现过这样的情况这应该和Oracle版本有关我们知道Oracle i和它前面的版本一个显着的区别就是大部分的Oracle系统程序现在均采用Java驱动其实这也就是产生字符集乱码问题的根本所在非Java驱动的程序如SQL*Plus有一个系统参数NLS_LANG该参数在UNIX系统中设置在环境变量中在Windows操作系统中设置在注册表中这个参数决定了客户端应用程序的字符集而对于基于Java应用的程序如现在遇到的SQL*PLus WorksheetNLS_LANG参数对这类程序是不起任何作用的
三解决方案
找到了问题产生的原因后下面来讨论如何解决该问题对于Oracle Enterprise Manager中的所有工具有一个配置文件名为dbappscfgproperties修改该文件即可解决上述问题这个文件的位置在$ORACLE_HOME\sysman\config目录下用任何的文本编辑器打开该文件在这个文件里面找到这样一项# SQLPLUS_NLS_LANG=AMERICAN_AMERICAWEISOP
去掉注释符#同时将其修改为SQLPLUS_NLS_LANG=AMERICAN_AMERICAZHSGBK
对于Windows操作系统还需要修改一项在文件中找到# SQLPLUS_SYSTEMROOT=c:\\WINNT去掉注释符将其修改为你所在机器的操作系统主目录如操作系统的主目录在D盘的Winnt下则将其修改为 SQLPLUS_SYSTEMROOT=d:\\WINNT
对于后面一项的修改只对Windows操作系统进行对UNIX操作系统则不需要如果在Windows操作系统中不修改该项在Oracle Enterprise Manager中连接系统时会提示如下的错误
ORA TNS:protocol adapter error
或者
ORA Connect failed because target host or object does not exist
修改完成后保存文件退出编辑重新连接SQL PLUS Worksheet字符集乱码问题得到解决显示正确的简体中文字符集