在windows 2003上使用Sql Plus产生中文乱码,查阅有关资料显示是Sql Plus的字符集和Oracle服务器使用的字符集不匹配。
设置客户端与服务器端统一字符集
于是依次查询windows编码字符集、NLS_LANG字符集、服务器端字符集如下:
- windows编码字符集:在命令行敲入chcp命令,显示936,说明是使用GBK;或者在cmd命令行标题栏右键属性,在弹出对话框内可以看到当前的字符集编码;
- NLS_LANG字符集:由于之前没设环境变量,所以NLS_LANG为空;
- 服务器端字符集:执行SQL语句:
select userenv(‘language’) from dual;
SIMPLIFIED CHINESE_CHINA.AL32UTF8;
于是经过上述三部,非常兴奋地设置环境变量NLS_LANG为SIMPLIFIED CHINESE_CHINA.AL32UTF8:
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8
从而使客户端和服务器端字符集统一。但遗憾的是仍然没能解决乱码,只是乱码换了张乱的面孔而已。
修改注册表NLS_LANG的值
于是根据资料又查询了注册表得到:
nls=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
于是修改注册nls的值为SIMPLIFIED CHINESE_CHINA.AL32UTF8,再次遗憾问题依旧。
设置字符集为ZHS16GBK
有人说如果操作系统的chcp是936,果断设置NLS_LANG为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,设置后,乱码果然正常了。
问题解决了,但原因仍然没搞明白,请高手解答。