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

在Oracle数据库中保存波斯语/阿拉伯语数字和数字,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我们有一个Oracle数据库,其中有许多记录。最近我们注意到,我们不能在数据类型为nvarchar2的列中保存波斯语/阿拉伯语数字,而是显示问号?的数字 我通过以下命令检查字符集: SELECT * from NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); 这个命令呢 SELECT USERENV('language') FROM DUAL; 结果分别是这

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

我通过以下命令检查字符集:

SELECT * 
from NLS_DATABASE_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
这个命令呢

SELECT USERENV('language') FROM DUAL;
结果分别是这两个:

我还发出以下命令:

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
结果似乎不错,但不幸的是,我们仍然无法在该列中保存任何波斯语/阿拉伯语数字。不过,波斯语/阿拉伯语字母表还行。你知道这个问题的原因吗

谢谢

USERENV'language'不返回您的客户端字符集

因此,从DUAL中选择USERENV'language';等于

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,尽管似乎有一种奇怪的解决方法:

检查您的客户端NLS_LANG设置。它由注册表HKLM\SOFTWARE\ORACLE\KEY\u%ORACLE\u HOME\u NAME%\NLS\u LANG分别定义。HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY\uu%ORACLE\u HOME\u NAME%\NLS\u LANG或as环境变量。环境变量优先

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

如果应用程序在Java上运行,请查看以下内容:


另请参见帮个忙,将数据库的主要字符集从AR8MSWIN1256转换为AL32UTF8。这些问题中的大多数都会消失。你可以忘记NCHAR和NVARCHAR2。他们不再需要了

这是一次性的努力,会有很多次的回报


有关说明,请参阅。

运行SELECT DUMP…,1016 FROM…,您会得到什么?如果您在SQL Developer中看到这一点,就像您正在查询这些设置一样,您正在使用什么编码-从工具->首选项->环境如果您没有看到它,那么您会在哪里看到它?请不要粘贴屏幕截图。以文本形式编辑您的问题。从表中选择,而不是从表中选择。最后,我们设法迈出了找到解决方案的第一步。0,3f是一个问号,因此这不是一个简单的显示问题-您的数据库中有错误的数据,无法再更正,信息丢失。很可能是由于客户端应用程序的错误设置而插入的。由于您没有告诉我们您正在使用哪个应用程序,因此几乎不可能提供任何帮助。实际上,我们的应用程序是用Java编写的。我正在尝试检查JDBC全球化链接。如果我这样做,我的数据会发生什么?所有保存为AR8MSWIN1256的数据都将正确转换为AL32UTF8。由于它是AR8MSWIN1256的超集,转换是无损的。我会尝试这个解决方案,我会让你知道谢谢你CodoYes,转换不能神奇地恢复问号。转储显示问号存储在数据库中,而不是显示无效数据的工件。将DB转换为AL32UTF8当然是一个好主意,但除非正确配置weblogic/java,否则无法解决问题。因为您有一个NVARCHAR2列,所以AL16UTF16无论如何都是hss的完全unicode支持。