如何在 SQLite 中搜索特定的 BLOB?

Pet*_*rCo 3 vb.net sqlite blob

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

CREATE TABLE pictures(id INTEGER PRIMARY KEY AUTOINCREMENT, icondata BLOB)
Run Code Online (Sandbox Code Playgroud)

写入二进制数据的代码片段是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

如果我尝试:

SQLcommand.CommandText = "SELECT id FROM pictures WHERE icondata=@img"
Run Code Online (Sandbox Code Playgroud)

并具有与上述相同的参数:

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
Run Code Online (Sandbox Code Playgroud)

我没有得到任何结果。

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

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

Mik*_*keT 7

您可以在此处搜索 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%';
Run Code Online (Sandbox Code Playgroud)

这导致:-

第一个查询按预期找到了 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,所以我不确定您如何将上述内容编码为传递的参数。