比较PreparedStatement中的Blob类型

时间:2011-08-08 01:12:59

标签: blob prepared-statement derby

我正在使用Derby数据库。我写了这个问题:

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”和“BLOB”之间的比较。   类型必须具有可比性。字符串类型还必须具有匹配的排序规则。如果是   llation不匹配,可能的解决方案是强制转换操作数   默认排序规则(例如SELECT tablename FROM sys.systables WHERE CAST(tabl   en as AS VARCHAR(128))='T1')

如何编写查询以避免此问题?

我也尝试过使用Convert,但它也不能用于:

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

此外,是否可以获取传入参数的数据类型?通过反思或其他方式。

1 个答案:

答案 0 :(得分:2)

无法直接搜索BLOB列是一个非常基本的限制,我认为你无法绕过它。

如果您的应用程序要求您通过BLOB数据的完全匹配来定期搜索数据库,我通常在我的应用程序中执行的操作是向数据库中添加一个类型为VARCHAR(128)的附加列,并存储SHA-1哈希列中BLOB值的哈希值。

然后,要搜索数据库,请计算要搜索的blob的哈希值,然后在哈希列中搜索完全匹配。