sql plus worksheet是一个窗口图形界面的sql语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相对sql/plus受到了很大的欢迎。但从oracle 8i以后,如果安装oracle 8i时选取的是别于英语的字符集,对于我们中国,通常会选取简体中文字符集(zhs16gbk),安装成功后,运行sql plus worksheet程序,会出现所有的中文显示以及查询结果均为乱码的情况。
一、问题描述
sql plus worksheet是一个窗口图形界面的sql语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相对sql/plus受到了很大的欢迎。但从oracle 8i以后,如果安装oracle 8i时选取的是别于英语的字符集,对于我们中国,通常会选取简体中文字符集(zhs16gbk),安装成功后,运行sql plus worksheet程序,会出现所有的中文显示以及查询结果均为乱码的情况。
二、问题分析
最初出现该问题,首先怀疑就是安装时字符集设置有问题,也就是说没有设置正确的简体中文字符集。首先检查数据库字符集,在sql/plus中,运行下面的sql语句,检查所连接数据库的字符集:
sql> select userenv('language') from dual; userenv('language') simplified chinese_china.zhs16gbk |
查询结果发现数据库安装时所选字符集为简体中文zhs16gbk,说明安装时字符集设置完全正确。第二步开始怀疑是用户客户端字符集问题,检查客户端注册表,打开注册表编辑程序(regedit),在hkey_local_machine/software/oracle/nls_lang,发现oracle客户端字符集为american_america.zhs16gbk,设置也完全正确,可以排除是客户端字符集设置错误的问题。同时还有一个现象就是在同一个客户端机器上sql/plus中的查询字符集显示完全正常,这也说明不是字符集设置问题,而是系统程序sql/plus worksheet的问题。
在oracle 8i以前的版本中,从来没有出现过这样的情况,这应该和oracle版本有关,我们知道oracle 8i和它前面的版本一个显著的区别就是大部分的oracle系统程序,现在均采用java驱动,其实这也就是产生字符集乱码问题的根本所在。非java驱动的程序,如sql*plus,有一个系统参数nls_lang,该参数在unix系统中设置在环境变量中,在windows操作系统中设置在注册表中,这个参数决定了客户端应用程序的字符集。而对于基于java应用的程序,如现在遇到的sql*plus worksheet,nls_lang参数对这类程序是不起任何作用的。
三、解决方案
找到了问题产生的原因后,下面来讨论如何解决该问题。对于oracle enterprise manager中的所有工具,有一个配置文件名为dbappscfg.properties,修改该文件即可解决上述问题。这个文件的位置在$oracle_home\sysman\config目录下,用任何的文本编辑器打开该文件,在这个文件里面,找到这样一项,
# sqlplus_nls_lang=american_america.we8iso8859p1 |
去掉注释符#,同时将其修改为
sqlplus_nls_lang=american_america.zhs16gbk |
对于windows操作系统,还需要修改一项,在文件中找到# sqlplus_systemroot=c:\\winnt40,去掉注释符,将其修改为你所在机器的操作系统主目录。如操作系统的主目录在d盘的winnt下,则将其修改为
sqlplus_systemroot=d:\\winnt |
对于后面一项的修改只对windows操作系统进行,对unix操作系统则不需要。如果在windows操作系统中不修改该项,在oracle enterprise manager中,连接系统时,会提示如下的错误:
ora-12560 tns:protocol adapter error |
或者
ora-12545 connect failed because target host or object does not exist |
修改完成后,保存文件,退出编辑。重新连接sql plus worksheet,字符集乱码问题得到解决,显示正确的简体中文字符集。
阅读关于 oracle数据库 字符集乱码 问题分析 解决办法 的全部文章