2017-09-13 95 views
2

我最近遇到一个问题,试图从Oracle数据库检索CLOB值与的Java。有一个表将XML文件存储为CLOBNLS_CHARACTERSET设置为AL32UTF8。 如果我尝试使用java.sql包检索值,然后使用ResultSet.getClob().getAsciiStream(),然后使用UTF-8编码将其转换为字符串,然后我得到一个有效的XML。java.sql.ResultSet.getString()返回字符串多余的字符

但是,如果我使用ResultSet.getString(),XML解析器失败,解析异常。

调试时,提取的值看起来像this。它只包含文件的一半。

其他XML文件可以用ResultSet.getString()没有问题的选择。
我没有看到在损坏的和有效的XML的ASCII表示方面有任何明显的区别。
当您向数据库重新插入相同的值时问题得到解决。

你能解释一下这种行为吗ResultSet.getString()方法吗?

有关Oracle信息

Oracle version is 12.1.0.2.0. 

关于JDK的信息:

java version "1.7.0_131" 
OpenJDK Runtime Environment (rhel-2.6.9.0.0.1.el7_3-x86_64 u131-b00) 
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode) 

回答

-1

我相信它返回CLOB的存储地址,出于某种原因,当你与getCLOB得到它,它使得XML 。

检查您存储的XML,您可能会忘记标记关闭或者在存储的XML文件中可能存在其他语法问题。

+0

'ResultSet.getString()'和'ResultSet.getClob()'从存储文件返回数据,我检查。存储的XML是有效的。正如我指出的那样,如果我在数据库中插入相同的值,错误就会消失 –

1

对我来说,它看起来像是特定的clob实际上并不像UTF-8那样用UTF-8编码,而是UTF-16。它偶尔会发生data can be written to a column using a charset other than the NLS_CHARACTERSET。这解释了为什么使用正确的本地字符集重新插入数据时问题得到解决。

我猜测Clob.getAsciiStream()有额外的逻辑来处理这种事情 - 可能是因为错误地编码了overlong (00-padded) UTF-8,这与ASCII代码点的UTF-16无法区分。