在西方字符集的Oracle数据库上用Java操作UTF8数据

虽然Oracle推荐建立一个新的Oracle instance的时候最好选用AL32UTF8作为默认的字符集,这样可以更好的来支持国际化的各种语言字符集的数据。可是还是由于各种各样的历史原因,有一些Oralce数据库的instance还是用的默认的西方字符集。在这样的数据库下面,对于UTF8数据的更新,要进行一些额外的操作。

本文测试所用的Oracle数据库的NLS信息如下
[list]
[*]NLS_LANGUAGE [align=right]AMERICAN[/align]
[*]NLS_CHARACTERSET [align=right]WE8ISO8859P1[/align]
[*]NLS_NCHAR_CHARACTERSET [align=right]UTF8[/align]
[/list]

数据库的表字段选用了NVARCHAR2。


CREATE TABLE UTF8TEST (
LABEL NVARCHAR2(128)
);



使用的Oracle客户端是Oracle SQL Developer,这个是Oracle自家出的基于Java的客户端,默认对于多语言的select操作支持比较好,可以直接选出UTF8的数据。但是如果insert或是update的话,还是产生了乱码数据。


INSERT INTO UTF8TEST VALUES ('中文测试');

SELECT * FROM UTF8TEST;


------

LABEL
-------
¿¿¿¿


如果用java/groovy程序,也会产生同样的乱码。用的JDBC Driver是ojdbc14.jar

def db = [
url:'jdbc:oracle:thin:@XXX',
user:'XXX',
password:'XXX',
driver:'oracle.jdbc.driver.OracleDriver']

def sql = Sql.newInstance(db.url, db.user, db.password, db.driver)

sql.execute("INSERT INTO UTF8TEST VALUES ('中文测试')")

sql.close()


解决的方案,在运行程序的时候加入JVM的参数

-Doracle.jdbc.defaultNChar=true -Doracle.jdbc.convertNcharLiterals=true


Oracle的文档中有如下的说法:
[quote]
By default, the oracle.jdbc.OraclePreparedStatement interface treats the data type of all the columns in the same way as they are encoded in the database character set. However, since Oracle Database 10g, if you set the value of oracle.jdbc.defaultNChar system property to true, then JDBC treats all character columns as being national-language.
[/quote]

意思是说默认的话,程序jdbc用的是char的映射,只有当设置了JVM System property后,可以默认映射成NCHAR, NVARCHAR, NCLOB。

oracle.jdbc.convertNcharLiterals这个配置可以,用这如下的方法来操作

INSERT INTO UTF8TEST VALUES (N'中文测试');
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值