Oracle,utf-8,NVARCHAR2和很多混乱之处

问题描述

| 我在oracle 10g数据库中有以下\“ translation \”表:
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\';
翻译栏显示::3ѭ,而不是
œ
,我不知道为什么。 由于遗留问题,我无法将整个数据库转换为使用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
    

解决方法

        由于您使用绑定变量而不是硬编码的文字,因此您应该能够将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扩展。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...