将国家字符插入oracle NCHAR或NVARCHAR列不起作用

Kar*_*rlP 6 java oracle unicode nvarchar sqlplus

在oracle数据库中插入字符串时,一些国家字符会被问号替换,即使它们插入NCHAR或NVARCHAR列 - 应该能够处理所有Unicode字符.

使用Oracle的SQL Developer,sqlplus或使用JDBC驱动程序会发生这种情况.

数据库NLS_CHARACTERSET设置为WE8ISO8859P1(西欧iso-8859-1).用于NCHAR列的NLS_NCHAR_CHARACTERSET设置为AL16UTF16.(UTF-16)

任何不在NLS_CHARACTERSET中的字符似乎都被替换为反转的问号.

Kar*_*rlP 21

编辑:请注意,在Oracle上处理UTF的最佳方法是使用数据库字符集AL32UTF8创建数据库,并使用普通的varchar2列.使用nchar列的一个问题是,当默认情况下将参数作为nchar发送时,oracle不能使用普通char/varchar2列的索引.

无论如何:如果你不能转换数据库:


首先,unicode文字需要以'n'为前缀,如下所示:

select n'Language - Språk - J?zyk' from dual;
Run Code Online (Sandbox Code Playgroud)

*)8位编码无法处理此文本

不幸的是,这还不够.

出于某种原因,数据库客户端的默认行为是将所有字符串文字转换为数据库字符集,这意味着即使在数据库看到字符串之前,也会更改值.

客户端需要一些配置才能将unicode字符插入NCHAR或NVARCHAR列:

Unix上的SQL Plus

这些environemnet变量设置unix环境和sqlplus使用UTF-8文件,并配置sqlplus以在unicode中发送字符串文字.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true
Run Code Online (Sandbox Code Playgroud)

(en_US.UTF-8适用于Solaris - Linux或其他系统可能需要不同的字符串,用于locale -a列出支持的语言环境.)

JDBC驱动程序

使用Oracles JDBC驱动程序的应用程序需要定义以下系统属性,以便在unicode中发送字符串文字.

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true
Run Code Online (Sandbox Code Playgroud)

SQL Developer

找到sqldeveloper.conf,并添加以下行:

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
Run Code Online (Sandbox Code Playgroud)

Microsoft Windows上的SQL Plus

如果Microsoft Windows上的SQLplus或Toad完全处理utf-8,我还没试过.Sqlplusw.exe可能会这样做,并且以下注册表设置可能会起作用.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true
Run Code Online (Sandbox Code Playgroud)