6

我在 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)

当我尝试这样做时:

update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';

然后我运行这个:

select * from translation where id = 'MY_ID' and language = 'fr';

并且翻译栏显示: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

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

4

1 回答 1

1

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

如果您使用直接 JDBC 写入数据库,则 JDBC Developer's Guide 中有一个关于将数据写入 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 扩展。

于 2011-06-07T15:20:17.757 回答