我阅读了许多与Stack Overflow相关的主题,并且花了一整天的时间在Google上搜索以下问题,但是我没有发现任何有帮助的东西,但是问题似乎并不复杂。
我有一个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将我的数据保存到db中。我有数千行插入数据的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('ñ$ߤ*>;''<’'));
没有任何帮助。
那我该怎么办?
在安装了PLSQL的PC上,将NLS_LANG
注册条目的值设置为等于PC的operation system locale (code page)
等效值。
如何检测操作系统的语言环境?
如何将操作系统语言环境映射到NLS_LANG值?
使用PLSQL时,将从NLS_LANG注册表项中读取创建Oracle会话所需的客户端语言的初始参数。
由于Oracle文档的缘故,数据库中通常会出现无效数据,因为在客户端上未正确设置NLS_LANG参数。NLS_LANG值应反映客户端操作系统代码页。
例如,在英语Windows环境中,代码页为WE8MSWIN1252。正确设置NLS_LANG参数后,数据库可以自动将来自客户端操作系统的传入数据转换为其编码。
当使用JAVA方法时,client-language参数由“控制面板”中“区域和语言选项”下的值设置,因此一切正常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句