【问题标题】:How to search for a specifc BLOB in SQLite?如何在 SQLite 中搜索特定的 BLOB?
【发布时间】:2019-06-04 00:20:55
【问题描述】:

我将图片中的二进制数据写入我的 SQLite 数据库到一个名为“icondata”的 BLOB 字段中。

CREATE TABLE pictures(id INTEGER PRIMARY KEY AUTOINCREMENT, icondata BLOB)

写入二进制数据的代码sn-p为:

SQLcommand.CommandText = "INSERT INTO pictures (id, icondata) VALUES (" & MyInteger & "," & "@img)"
SQLcommand.Prepare()
SQLcommand.Parameters.Add("@img", DbType.Binary, PicData.Length)
SQLcommand.Parameters("@img").Value = PicData

这很好用,我可以使用SQlite Spy 之类的工具在数据库中找到 BLOB 值。

但是如何搜索特定的“icondata”BLOB?

如果我尝试一下:

SQLcommand.CommandText = "SELECT id FROM pictures WHERE icondata=@img"

和上面一样的参数:

SQLcommand.Prepare()
SQLcommand.Parameters.Add("@img", DbType.Binary, PicData.Length)
SQLcommand.Parameters("@img").Value = PicData

Dim SQLreader As SQLite.SQLiteDataReader = SQLcommand.ExecuteReader()
While SQLreader.Read()
    ... Process found database entries....
End While

我没有得到任何结果。

如果我将 SELECT 查询更改为“LIKE”而不是“=”,我会得到所有带有 BLOB 的条目,而不仅仅是匹配的条目。

我必须如何编写 SELECT 查询才能找到特定 BLOB 的 1 个完全匹配的条目?

【问题讨论】:

  • 您真的要搜索数据吗?我想你想搜索一张图片,因为它的 id?!
  • 你的表定义是什么?
  • 根据图像的实际二进制数据检索数据真是太疯狂了。如果您不打算通过 ID 或标签等进行检索,那么至少存储二进制数据的哈希值,然后检索将是对您拥有的二进制数据进行哈希处理,然后使用相同的哈希值检索记录的情况。通过二进制数据本身检索简直是疯了。
  • @corion @ jmcihinney 我知道搜索二进制数据并不是最好的方法。你知道解决办法吗?
  • @shawn 表定义命令写在我帖子的第二行。您需要更多信息吗?

标签: vb.net sqlite blob


【解决方案1】:

您可以在 BLOB 上搜索这里的一些示例:-

DROP TABLE IF EXISTS pictures;
CREATE TABLE IF NOT EXISTS pictures (id INTEGER PRIMARY KEY, icondata columntypedoesnotmatter);
INSERT INTO pictures (icondata) VALUES
    (x'fff1f2f3f4f5f6f7f8f9f0fff1f2f3f4f5f6f7f8f9f0'),
    (x'ffffffffffffffffffff'),
    (x'010203040506070809'),
    (x'010203040506070809010203040506070809')
    ;
SELECT id, hex(icondata) FROM pictures WHERE icondata = x'010203040506070809' OR icondata = x'FFFFFFFFFFFFFFFFFFFF';
SELECT id, hex(icondata) FROM pictures WHERE icondata LIKE '%'||x'F0'||'%';
SELECT id, hex(icondata) FROM pictures WHERE hex(icondata) LIKE '%F0%';

这会导致:-

第一个查询按预期找到 2 行(第 2 行和第 3 行)

SELECT id, hex(icondata) FROM pictures WHERE icondata = x'010203040506070809' OR icondata = x'FFFFFFFFFFFFFFFFFFFF'; 结果:-

第二个查询没有按预期工作,是如何不使用 LIKE 的示例:- 即SELECT id, hex(icondata) FROM pictures WHERE icondata LIKE '%'||x'F0'||'%'; 导致意外的两行:-

  • 我认为这种行为是由于只检查了高/低位,但我找不到相关文档。

然而,第三个查询使用 hex 函数将存储的 blob 转换为其十六进制字符串表示形式,并将其与 F0 的字符串表示形式进行比较

SELECT id, hex(icondata) FROM pictures WHERE hex(icondata) LIKE '%F0%'; 导致预期的单行:-

我从未使用过 vb.net,所以我不确定您如何将上述代码编码为传递参数。

【讨论】:

    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多