簡體   English   中英

java.sql.ResultSet.getString()返回帶有額外字符的字符串

[英]java.sql.ResultSet.getString() returns string with extra characters

我最近在嘗試使用JavaOracle DB中檢索CLOB值時遇到問題。 有一個表將XML文件存儲為CLOB NLS_CHARACTERSET設置為AL32UTF8 如果我嘗試使用java.sql包並使用ResultSet.getClob().getAsciiStream()檢索值,然后將其轉換為UTF-8編碼的字符串,那么我將獲得有效的XML。

但是,如果我使用ResultSet.getString() ,則XML解析器將由於解析異常而失敗。

調試時,提取的值如下所示 它僅包含文件的一半。

可以使用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)

在我看來,特定的Clob實際上並未像它聲稱的那樣在UTF-8中編碼,而是在UTF-16中編碼。 有時可能會使用NLS_CHARACTERSET以外的字符集數據寫入列 這就解釋了為什么使用正確的本地字符集重新插入數據時問題得以解決。

我猜想Clob.getAsciiStream()具有處理此類問題的額外邏輯-可能是針對錯誤編碼的加長(填充了00)的UTF-8 ,對於ASCII碼點而言,它與UTF-16是無法區分的。

我相信由於某種原因,它返回CLOB的存儲地址,當您通過getCLOB獲得它時,它就將其制成XML。

檢查您存儲的XML,您可能會忘記關閉標簽,或者在存儲的XML文件中可能存在其他語法問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM