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

Java 将国家字符插入oracle NCHAR或NVARCHAR列不起作用,java,oracle,unicode,sqlplus,nvarchar,Java,Oracle,Unicode,Sqlplus,Nvarchar,在oracle数据库中插入字符串时,某些国家字符将替换为问号,即使它们是 插入到NCHAR或NVARCHAR列中-应该能够处理所有Unicode字符 这可以使用Oracle的SQL开发人员sqlplus或JDBC驱动程序实现 数据库NLS_字符集设置为WE8ISO8859P1(西欧iso-8859-1) 用于NCHAR列的NLS\u NCHAR\u字符集设置为AL16UTF16。(UTF-16) 任何不在NLS_字符集中的字符似乎都将替换为一个倒问号。编辑:注意,在Oracle上处理UTF的最佳

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

这可以使用Oracle的SQL开发人员sqlplus或JDBC驱动程序实现

数据库NLS_字符集设置为WE8ISO8859P1(西欧iso-8859-1) 用于NCHAR列的NLS\u NCHAR\u字符集设置为AL16UTF16。(UTF-16)


任何不在NLS_字符集中的字符似乎都将替换为一个倒问号。

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

无论如何:如果无法转换数据库:


首先,unicode文本需要以“n”作为前缀,如下所示:

select n'Language - Språk - Język' from dual;
*)8位编码无法处理此文本

不幸的是,这还不够

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

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

Unix上的SQL Plus

这些环境变量设置unix环境和sqlplus以使用UTF-8文件, 并将sqlplus配置为以unicode格式发送字符串文本

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true
(en_US.UTF-8适用于Solaris-Linux或其他系统可能需要不同的字符串,请使用
locale-a
列出支持的locale。)

JDBC驱动程序

使用Oracles JDBC驱动程序的应用程序需要定义以下系统属性以发送unicode格式的字符串文本

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true
SQL开发人员

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

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
Microsoft Windows上的SQL Plus

我还没有尝试过微软Windows或Toad上的SQLplus是否能够处理utf-8。 Sqlplusw.exe可以做到这一点,下面的注册表设置可以做到这一点

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true

谢谢卡尔普,这让我走了。重述对我有用的东西

在linux上使用sqlplus将中文(任何utf8)文本插入到非unicode数据库(例如:ISO8859等)的nvarchar列中

注意,在我的系统中,这些db参数对char使用单字节编码,而对nchare使用多字节编码。 NLS_字符集WE8ISO8859P1
NLS\u NCHAR\u字符集AL16UTF16

例如:

字符串前面的“N”很重要。 此外,必须在启动sqlplus之前设置环境

# Important to tell sqldeveloper what encoding is needed.
export NLS_LANG=AMERICAN_AMERICA.UTF8
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits.

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true

我已经花了一个星期的时间来解决这个问题,所以我在自我回答这个问题。。。我希望谷歌能找到它……请注意,在Oracle上支持UTF8的好方法是使用数据库字符集AL32UTF8创建数据库,并使用普通的varchar2列。您能解释一下如何在Microsoft SQL Express 2005上实现这一点吗?不是一般的。关于Java,jdbc驱动程序和visual studio是开箱即用的,如果列类型为nchar并且文本前缀为n。您知道如何为.NET System.Data.OracleClient驱动程序设置它吗?不知道。如果可能,请在创建数据库时使用NLS_字符集AL32UTF8,并避免使用nchar列。“使用Unicode进行OCI编程”文档可能包含一些信息。答案并非如此。答案应该是向OP展示一个只针对其问题的解决方案,但它已经存在一个非常适合的解决方案。你的答案是多余的,不属于这里。我知道您对堆栈溢出还不熟悉,但这不是这里普遍接受的答案。对不起,但我希望你能理解我,请考虑删除你的答案。
# Important to tell sqldeveloper what encoding is needed.
export NLS_LANG=AMERICAN_AMERICA.UTF8
# Others might find AMERICAN_AMERICA.AL32UTF8 or whatever better suits.

# ** THIS MATTERS - DOES NOT WORK WITHOUT !! 
export ORA_NCHAR_LITERAL_REPLACE=true