我最近遇到了尝试使用 Java 从 Oracle DB 检索 CLOB 值的问题。有一个表将XML文件存储为 CLOB 。 NLS_CHARACTERSET
设置为AL32UTF8
。
如果我尝试使用java.sql
包检索值并使用ResultSet.getClob().getAsciiStream()
然后使用UTF-8
编码转换为String,那么我将获得有效的XML。
但如果我使用 ResultSet.getString()
,则XML解析器会因解析异常而失败。
在调试时,提取的值看起来像this。它只包含文件的一半。
其他可以使用 ResultSet.getString()
选择XML文件,没有任何问题
我没有看到损坏和有效的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)
答案 0 :(得分: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无法区分。
答案 1 :(得分:-1)
我相信它出于某种原因返回CLOB的存储地址,当你用getCLOB获取它时,它就会成为XML。
检查存储的XML,您可能会忘记关闭标记,或者在存储的XML文件中可能存在其他语法问题。