当前位置:首页 >> 计算机软件及应用 >>

PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS


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。

图 12


相关文章:
更多相关标签: