2017-09-13 67 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無法區分。