JDBC对Oracle的调用返回3个问号

时间:2012-02-22 17:50:33

标签: java oracle jdbc spring-jdbc

我使用JDBCTemplate调用oracle存储过程,该存储过程的输入/输出参数为STRUCT。此结构上的一个字段是VARCHAR,它根据存储过程逻辑进行更新。但是当从调用返回时它只包含三个问号 - '???'。这可能是Riddler的工作,但听起来更像是char编码问题。

在我们将数据库切换到具有WE8ISO8859P15(ISO8859)字符编码的数据库之前,这一工作正常,这是通过以下方式检索的:

SELECT NLS_CHARACTERSET FROM NLS_DATABASE_PARAMETERS

以前工作的字符集是WE8MSWIN1252(MSWIN-1252),它工作正常。所以我猜这是一个字符集问题,虽然我有点小心,因为它总是只返回3个问号而不管应该返回多少文本。

据我所知,底层的JDBC驱动程序(jdbc:oracle:thin)会自动执行所有字符编码,并将数据库字符集转换为UTF-16(Java字符编码)但是看起来没有发生这种情况。我正在使用StoredProcedure类(Spring的一部分)来调用StoredProcedure。

我也尝试将orai18n.jar添加到类路径中,但没有成功。然而,考虑到ISO-8859是一个非常标准的字符集似乎很不寻常,所以我可能会走错路。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

由于数据库字符编码存储为ISO-8859- 15 ,这是一个字符编码问题 - 此标准的第15版引起了所有问题,基本上是添加了欧元符号。我们用于通过JDBC连接的oracle驱动程序根本无法从ISO-8859-15转换为Java的UTF-16。

恢复到ISO-8859-1或在数据库上更改为UTF-8编码(更好)解决了这个问题。将orai18n jar添加到类路径中可能会解决这个问题,但由于没有现成的OSGI包,所以它并不容易。我的建议是根本不用担心Oracle数据库。