PL/SQL向Oracle数据库输入中文后变为问号 和 启动PL/SQL时提示NLS_LANG在客户端不能确定的解决办法
工作需要,最近在VM虚拟机里安装了Redhat Linux系统,并在Redhat里安装了Oracle10.5,接着在本地Win7系统里,通过安装Oracle Instant Client客户端和PL/SQL Developer工具,来访问Oracle进行SQL操作。但一直遇到一个很奇怪的问题,通过PL/SQL Developer工具,不管是通过Insert into 插入的,或者通过菜单:工具-ODBC导入器导入的数据,只要包含中文的值,查询时都显示其变为“?”问号了(图1)。
图 1
上网了解到这跟字符集有关,Oracle安装和导入数据时,需要Oracle的Server服务器、Client客户端以及安装环境三者的字符集编码一致,否则就会出现乱码问题。如下图2所示,Oracle数据库的区域语言、字符集和安装环境的区域语言、字符集设置不一致,导致Oracle中文提示变为乱码:
图 2
通过语句:
Select * from V$NLS_PARAMETERS where PARAMETER='NLS_CHARACTERSET';
Select USERENV('LANGUAGE') from DUAL;
可以查询到Oracle服务器正在使用是什么字符集;
通过查注册表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\里,NLS_LANG的具体键值即可知道客户端使用的字符集(图3)。
图 3
一开始检查到Oracle服务端和客户端使用的字符集不一,于是将服务端的字符集改成ZHS16GBK以保持跟客户端的一致,但输入中文以后测试发现问题还是没解决。
继续上网寻解决办法,了解到PL/SQL Developer可以设置使用的字符集,在菜单:工具-首选项里,可能因为版本问题了一遍没发现,倒是发现在菜单:首选项-Oracle里有一项:检查客户及与服务器字符集是否匹配(图4),马上将其勾选,确定保存后退出PL/SQL Developer,再重新打开。
这时又提示:“NLS_LANG在客户端不能确定,字符集转变将造成不可预期的后果”(图5)。
图 4
图 5
根据网上提示,打PL/SQL Developer工具的:帮助-支持信息-信息 选项卡里进行检查,在“Character Sets”下面,有一项是:“NLS_LANG”,其值为空(图6),但上面已经检查过注册表NLS_LANG项的键值是正确的,这说明PL/SQL Developer工具没加载到注册表的信息。
图 6
看来得添加环境变量了,如下图7所示,在环境变量-系统变量里,新增变量NLS_LANG,将上面查到的Oracle服务端在使用的字符集(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)填进去即可,然后退出PL/SQL Developer再重新打开登陆进Oracle。
图 7
使用echo命令能看到环境变量设置成功(图8),加载成功的结果也可以在PL/SQL Developer的帮助中看到(图9):
图 8
图 9
重新向Oracle数据库中插入中文再查询,应该不会再变为问号了!
此时,如果在本地通过PL/SQL Developer操作远程数据库的话,提示信息应该是中文的(图10):
图 10
如果提示是英文的话,就得看看远程数据库的语言区域、或者操作系统的NLS_LANG变量是什么的了,比如下图11这种情况表示使用的是American美国区域的语言,所以提示当然是英文的啦!
图 11
关于NLS_LANG,涉及到了这几个表:V$NLS_PARAMETERS(使用的字符集,表示的就是本地NLS_LANG了,图12),V$NLS_VALID_VALUES(可用的字符集),NLS_DATABASE_PARAMETERS,NLS_INSTANCE_PARAMETERS。
安装plsql图 12
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论