Как искать конкретный BLOB в SQLite? - PullRequest
0 голосов
/ 09 января 2019

Я записываю двоичные данные из картинок в свою базу данных SQLite в поле BLOB, называемое «icondata».

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

Фрагмент кода для записи двоичных данных:

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

Это прекрасно работает, и я могу найти значения BLOB в базе данных с помощью инструмента, подобного SQlite Spy .

Но как мне найти конкретный BLOB "icondata"?

Если я попробую с:

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, чтобы найти 1 точно совпадающую запись для определенного BLOB?

1 Ответ

0 голосов
/ 09 января 2019

Вы можете выполнить поиск по 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'; Результат: -

enter image description here

Второй запрос не работает должным образом и является примером , как не использовать LIKE : - то есть SELECT id, hex(icondata) FROM pictures WHERE icondata LIKE '%'||x'F0'||'%'; приводит к неожиданным двум строкам: -

enter image description here

  • Я полагаю, что такое поведение связано только с проверкой битов старшего / младшего разрядов, но я не могу найти соответствующую документацию.

Третий запрос, однако, преобразует сохраненный большой двоичный объект в его шестнадцатеричное строковое представление, используя функцию hex , и сравнивает его со строковым представлением F0

.

т.е. SELECT id, hex(icondata) FROM pictures WHERE hex(icondata) LIKE '%F0%'; приводит к ожидаемой единственной строке: -

enter image description here

Я никогда не использовал vb.net, поэтому я не уверен, как бы вы кодировали вышеприведенное как переданные параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...