使用JDBC Oracle Thin驱动程序进行错误的字符串编码

时间:2016-02-11 11:22:50

标签: java oracle jdbc encoding

我正在使用带有ISO-8859-1数据的Oracle数据库。 当我尝试使用ResultSet从此DB获取String并将结果打印到控制台时,我得到了错误的编码输出。

Locale.getDefault(); // -> fr_FR
Charset.defaultCharset(); // -> UTF-8

但我尝试从ResultSet打印这些数据:

rs.getString("MY_COL"); // direct from ResultSet
new String(rs.getString("MY_COL").getBytes(Charset.forName("ISO-8859-15")), Charset.forName("UTF-8")); // convert ISO bytes to UTF-8 bytes

此输出:

générale
générale

那么,为什么Oracle JDBC驱动程序使用ISO-8859-1字节编码创建String? 如何在不更改数据库(也不转换String)的情况下获取UTF-8字节编码的字符串? 我可以从驱动程序配置中更改它吗?JMV args?

1 个答案:

答案 0 :(得分:0)

我猜您的数据库不在ISO 8859-1中(NLS_CHARACTERSET = WE8ISO8859P1)。

在数据库

create table foo (col1 varchar2(40));
insert into foo values('é');
insert into foo values(chr(233));
select dump(col1) from foo;

应该返回

Typ=1 Len=1: 233 
Typ=1 Len=1: 233 

如果你得到例如

Typ=1 Len=2: 195,169
Typ=1 Len=1: 233

然后您的数据库设置为UTF8(NLS_CHARACTERSET = AL32UTF8)。