甲骨文,utf-8,NVARCHAR2,以及很多混乱

tes*_*123 6 oracle spring nvarchar utf-8

我在oracle 10g数据库中有以下"翻译"表:

ID  VARCHAR2(100 BYTE)
LANGUAGE    CHAR(2 BYTE)
COUNTRY CHAR(2 BYTE)
TRANSLATION NVARCHAR2(2000 CHAR)
TRACK_TIMESTAMP DATE
TRACK_USER  VARCHAR2(2000 BYTE)
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做时:

update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';
Run Code Online (Sandbox Code Playgroud)

然后我运行这个:

select * from translation where id = 'MY_ID' and language = 'fr';
Run Code Online (Sandbox Code Playgroud)

翻译栏显示:S而不是,œ我不明白为什么.

由于遗留问题,我无法将整个数据库转换为使用UTF-8,还有其他选择吗?

目前国家字符集是AL16UTF16.普通字符集是WE8ISO8859P1.

我目前正在使用java 1.6

以上是一个简化的例子.以下是我的实际应用程序中的查询:

UPDATE TRANSLATION SET TRANSLATION=? WHERE TRANSLATION.COUNTRY=? and TRANSLATION.ID=? and TRANSLATION.LANGUAGE=? 1=1,800 - 2,500 œufs par heure 2=CA 3=3_XT_FE_ECS18 4=fr
Run Code Online (Sandbox Code Playgroud)

这里的问题是不添加œufs它添加¿ufs

Jus*_*ave 1

由于您使用的是绑定变量而不是硬编码文字,因此您应该能够将 Unicode 字符串传递到 UPDATE 语句。

如果您直接使用 JDBC 写入数据库,《JDBC 开发人员指南》中有一个有关将数据写入 NVARCHAR2 列的示例。如果您使用的是 1.5 JVM,则必须对每个 NVARCHAR2 列使用 OraclePreparedStatement.setFormOfUse 调用。在 1.6 JVM 中,生活变得更容易,因为 JDBC 4.0 添加了 NCHAR 和 NVARCHAR2 类型。如果您使用的是 1.5 JVM,那么让 Spring 等 ORM 框架使用 Oracle 的 JDBC 扩展可能是一项不小的任务。我对 Spring 不太熟悉,不知道需要采取哪些步骤才能实现这一点。

您或许可以修改连接字符串以指定defaultNChar=true。这将迫使驱动程序使用国家字符集处理所有字符列。这可能足以解决您的问题,而无需让 Spring 使用 OraclePreparedStatement 扩展。