在Oracle数据库中保存波斯语/阿拉伯数字和数字

时间:2017-12-21 08:08:03

标签: oracle oracle11g oracle10g

我们有一个Oracle数据库,里面有很多记录。最近我们注意到我们无法在数据类型为 nvarchar2 的列中保存波斯语/阿拉伯数字,而不是显示问号的数字"?"。

我使用这些命令检查了charset:

SELECT * 
from NLS_DATABASE_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

和这个命令

SELECT USERENV('language') FROM DUAL;

结果分别是这两个: enter image description here

我也发出这个命令:

SELECT DUMP(myColumn, 1016) FROM myTable;

结果是这样的:

Typ=1 Len=22 CharacterSet=AL16UTF16: 6,33,6,44,6,27,6,45,0,20,0,3f,0,3f,0,2f,0,3f,0,2f,0,3f

结果似乎没问题,但遗憾的是我们仍然无法在该列中保存任何波斯语/阿拉伯数字。但波斯语/阿拉伯语字母表还可以。你知道这个问题的原因是什么吗?

谢谢

2 个答案:

答案 0 :(得分:1)

USERENV('language') 返回您的客户端字符集。

所以,SELECT USERENV('language') FROM DUAL;等于

SELECT l.value||'_'||t.value||'.'||c.value
FROM (SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE') l
    CROSS JOIN (SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TERRITORY') t
    CROSS JOIN (SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET') c;

任何SQL语句都无法获取客户端 NLS_LANG(尽管似乎有一个奇特的解决方法:How do I check the NLS_LANG of the client?

检查您的客户NLS_LANG设置。它由Registry(HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG,resp。HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG)或Environment变量定义。环境变量优先。

然后,您必须确保您的客户端应用程序(您没有告诉我们您使用的是哪个)使用NLS_LANG中指定的相同字符集。

如果您的应用程序在Java上运行,请查看:Database JDBC Developer's Guide - Globalization Support

另见OdbcConnection returning Chinese Characters as "?"

答案 1 :(得分:0)

帮自己一个忙,并将数据库的主要字符集从AR8MSWIN1256转换为AL32UTF8。大多数这些问题都会消失。您可以忘记NCHARNVARCHAR2。他们不再需要了。

这是一次性的努力,将会回报一段时间。

有关说明,请参阅Character Set Migration