Oracle、utf-8、NVARCHAR2 以及很多混乱
我在 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
I have the following "translation" table in an oracle 10g database:
ID VARCHAR2(100 BYTE)
LANGUAGE CHAR(2 BYTE)
COUNTRY CHAR(2 BYTE)
TRANSLATION NVARCHAR2(2000 CHAR)
TRACK_TIMESTAMP DATE
TRACK_USER VARCHAR2(2000 BYTE)
When I try to do this:
update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';
Then I run this:
select * from translation where id = 'MY_ID' and language = 'fr';
and the translation column shows: S
instead of œ
and I have no idea why.
Due to legacy issues I cannot convert the whole database to use UTF-8, are there any other options?
Currently the national character set is AL16UTF16. The ordinary character set is WE8ISO8859P1.
I am currently using java 1.6
The above is a simplified example. Here is what the query looks like in my actual application:
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
The problem here is instead of adding œufs
it adds ¿ufs
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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 扩展。
Since you are using bind variables rather than hard-coded literals, you should be able to pass Unicode strings to your UPDATE statement.
If you were using straight JDBC to write to the database, there is an example in the JDBC Developer's Guide on writing data to a NVARCHAR2 column. If you are using a 1.5 JVM, it is necessary to use the OraclePreparedStatement.setFormOfUse call for each NVARCHAR2 column. In a 1.6 JVM, life gets easier because JDBC 4.0 added NCHAR and NVARCHAR2 types. If you are using a 1.5 JVM, getting an ORM framework like Spring to use the Oracle extensions to JDBC may be a non-trivial undertaking. I'm not familiar enough with Spring to know what steps would be necessary for that to happen.
Potentially, you may be able to modify the connection string to specify defaultNChar=true. That will force the driver to treat all character columns using the national character set. That may be enough to resolve your problem without getting Spring to use the OraclePreparedStatement extensions.