【发布时间】: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