Java 将国家字符插入oracle NCHAR或NVARCHAR列不起作用
在oracle数据库中插入字符串时,某些国家字符将替换为问号,即使它们是 插入到NCHAR或NVARCHAR列中-应该能够处理所有Unicode字符 这可以使用Oracle的SQL开发人员sqlplus或JDBC驱动程序实现 数据库NLS_字符集设置为WE8ISO8859P1(西欧iso-8859-1) 用于NCHAR列的NLS\u NCHAR\u字符集设置为AL16UTF16。(UTF-16)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的最佳
任何不在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