2011-08-08 83 views
0

我正在使用Derby數據庫。我寫了這個查詢:比較PreparedStatement中的Blob類型

InputStream is = new java.io.ByteArrayInputStream(BYTES); 
PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob =?)"); 
st11.setBlob(1,is,BYTES.length); 

dBlob是一個BLOB數據類型。 BYTES也是一個BLOB數據類型。

,但我得到以下情況例外,當我執行這個查詢:

造成的:ERROR 42818:不支持「BLOB」和「斑點」之間的比較。 類型必須具有可比性。字符串類型也必須具有匹配的排序規則。如果不匹配,則可能的解決方案是強制操作數強制爲默認排序規則(例如,SELECT tablename FROM sys.systables WHERE CAST(tabl ename AS VARCHAR(128))='T1')

如何編寫查詢來規避這個問題?

我也使用轉換嘗試,但它並沒有與工作過:而且

PreparedStatement st11 = conn.prepareStatement("select f from a1 where dBlob  
=CONVERT(?,BINARY)"); 
st11.setBlob(1,is,BYTES.length); 

,是有可能得到在傳遞參數的數據類型?通過反射或其他手段。

回答

1

無法直接在BLOB列上搜索是一個非常根本的限制,我不認爲你能夠繞過它。

如果您的應用程序要求您通過BLOB數據上的完全匹配來定期搜索數據庫,我通常在我的應用程序中執行的操作是向數據庫添加一個類型爲VARCHAR(128)的附加列,並存儲一個SHA-散列列中的BLOB值的1個散列。

然後,要搜索數據庫,請計算要搜索的BLOB的散列值,然後在哈希列中搜索完全匹配。

+0

謝謝布萊恩。我已經解決了這個問題。 由於某些原因,我正在比較PreparedStatement中設置的參數類型。是否可以爲所有LOB提供一個通用比較類型,還是需要針對每個CLOB,BLOB和nCLOB數據類型進行具體比較? – krammer