【问题标题】:Comparing Blob types in PreparedStatement比较 PreparedStatement 中的 Blob 类型
【发布时间】:2011-08-08 01:12:58
【问题描述】:

我正在使用 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 数据类型。

但是当我执行这个查询时出现以下异常:

原因:错误 42818:不支持“BLOB”和“BLOB”之间的比较。 类型必须具有可比性。字符串类型也必须有匹配的排序规则。如果合作 llation 不匹配,一个可能的解决方案是强制转换操作数 默认排序规则(例如 SELECT tablename FROM sys.systables WHERE CAST(tabl ename AS VARCHAR(128)) = 'T1')

如何编写查询来规避这个问题?

我也尝试过使用 Convert,但它也无法使用:

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

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

【问题讨论】:

    标签: blob prepared-statement derby


    【解决方案1】:

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

    如果您的应用程序要求您通过 BLOB 数据的精确匹配例行搜索数据库,我通常在我的应用程序中向数据库添加一个附加列,类型为 VARCHAR(128),并存储一个 SHA-1散列列中 BLOB 值的散列。

    然后,要搜索您的数据库,计算您要搜索的 blob 的哈希值,并在哈希列中搜索精确匹配。

    【讨论】:

    • 谢谢布莱恩。我已经解决了这个问题。由于某些原因,我正在比较 PreparedStatement 中设置的参数类型。是否可以为所有 LOB 提供一个通用比较类型,还是我需要专门为每个 CLOB、BLOB 和 nCLOB 数据类型进行比较?
    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 2011-09-03
    • 2023-03-26
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多