【问题标题】:Oracle SQL Developer client encodingOracle SQL Developer 客户端编码
【发布时间】:2013-12-23 17:55:51
【问题描述】:

我阅读了许多相关的 Stack Overflow 主题,并花了一整天的时间在谷歌上搜索以下问题,但我没有找到任何有用的信息,但问题似乎并不复杂。

我有一个 Oracle 数据库。 让我们看看下面的 PL/SQL 脚本:

    CREATE TABLE Dummy(
       id number(19,0),
       tclob clob,
       tnclob nclob,
       PRIMARY KEY (id));
    
    INSERT INTO dummy (id, tclob, tnclob) VALUES (1, 'ñ$ߤ*>;''<’', 'ñ$ߤ*>;''<’');
    SELECT tclob, tnclob FROM dummy;

我的问题是 'ñ' 和 ''' 字符存储为问号。 我也尝试通过 JAVA 加载之前插入的值,但我得到的是问号而不是特殊字符。

我创建了一个小的 Java 方法,它使用 OraclePreparedStatement 来保存测试数据,并使用 setNString() 方法将 nclob 数据附加到查询中。在这种情况下,所有字符在 Java 和 SqlDeveloper 中都能正常显示。

所以一个可能的解决方案是使用 JAVA 将我的数据保存到数据库中。我有数千行插入数据的 SQL 脚本,我不一定想用 java 重新编写整个东西。

那么问题来了:为什么 SqlDeveloper 会破坏特殊字符?

我的设置:

    SELECT DECODE(parameter, 'NLS_CHARACTERSET', 'CHARACTER SET',
    'NLS_LANGUAGE', 'LANGUAGE',
    'NLS_TERRITORY', 'TERRITORY') name,
    value from v$nls_parameters
    WHERE parameter IN ( 'NLS_CHARACTERSET', 'NLS_LANGUAGE', 'NLS_TERRITORY')

结果:

+---------------+--------------+
|     NAME      |    VALUE     |
+---------------+--------------+
| LANGUAGE      | HUNGARIAN    |
| TERRITORY     | HUNGARY      |
| CHARACTER SET | EE8ISO8859P2 |
+---------------+--------------+

我将SqlDeveloper/Preferences/Environment/Encoding 更改为UTF-8。 我还将HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1 值更改为HUNGARIAN_HUNGARY.UTF8

更新:我尝试使用以下语法插入数据:

    INSERT INTO dummy (id, tclob, tnclob) VALUES (1, N'ñ$ߤ*>;''<’', N'ñ$ߤ*>;''<’');
    INSERT INTO dummy (id, tclob, tnclob) VALUES (1, 'ñ$ߤ*>;''<’', to_nclob('ñ$ߤ*>;''<’'));

没有任何帮助。

那我该怎么办?

【问题讨论】:

  • 您能否在此处显示此查询的结果:select * from nls_database_parameters where parameter like '%SET'
  • 您的查询结果:NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_CHARACTERSET EE8ISO8859P2
  • 能否尝试关闭Oracle SQL Developer,然后在windows环境下设置NLS_LANG=HUNGARIAN_HUNGARY.UTF8,再打开SQL Developer再试一次?
  • 我试过了——我猜你的意思是我应该给系统添加一个环境变量。嗯,我试过了,但没用。

标签: windows oracle plsql character-encoding oracle-sqldeveloper


【解决方案1】:

您可以尝试使用regedit 工具在您的Win PC 上更改NLS_LANG 的值。

路径为:\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,当NLS_LANG 包含您的 Oracle 客户端当前编码的值。

有 Oracle 的可用编码列表: Commonly Used Values for NLS_LANG

【讨论】:

    【解决方案2】:

    在安装了PLSQL的PC上,设置NLS_LANG registery entry的值等于PC的operation system locale (code page),等效值。

    How to detect operating system language locale?
    How to map OS locale to NLS_LANG value?

    使用 PLSQL 时,从 NLS_LANG 注册表项中读取创建 Oracle 会话所需的客户端语言的初始参数。

    Due to Oracle documents,数据库中通常会出现无效数据,因为 NLS_LANG 参数是客户端设置不正确。 NLS_LANG 值应反映客户端操作系统代码页
    例如,在英文 Windows 环境中,代码页为 WE8MSWIN1252。正确设置 NLS_LANG 参数后,数据库可以自动将来自客户端操作系统的传入数据转换为其编码。

    使用 JAVA 方法时,客户端语言参数由控制面板中的区域和语言选项下的值设置,所以一切都会好的。

    【讨论】:

    • 感谢您的回复。这是否意味着我无法将 sqldeveloper 的编码更改为正确的编码?
    • 绝对可以。只需将注册表项设置为您的操作系统本地。例如,如果它是英语-我们将值设置为 AMERICAN_AMERICA.WE8MSWIN1252 然后重新启动。让我知道会发生什么
    • 谢谢,明天下午我会试一试并回复我的结果。
    • 您好 Mohsen,感谢您的帮助。我尝试了你的建议。我检查了我的系统信息,我的本地系统语言是 hu。所以我尝试将 NLS_LANG (HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1) 设置为 HUNGARIAN_HUNGARY.EE8MSWIN1250,但什么也没发生。然后我将其设置为 AMERICAN_AMERICA.WE8MSWIN1252 - 也没有发生任何事情。每次更改注册表后,我都重新启动了计算机。还有其他想法吗?
    • 您是否将 HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1\NLS_LANG 设置为 HUNGARIAN_HUNGARY.EE8MSWIN1250 ?
    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    相关资源
    最近更新 更多