Как найти длину (размер) двоичного двоичного объекта в sqlite - PullRequest
34 голосов
/ 30 октября 2008

У меня есть таблица sqlite, которая содержит BLOB-файл, но мне нужно сделать проверку размера / длины для BLOB-объекта, как мне это сделать?

Согласно некоторой документации, которую я нашел, использование length (blob) не сработает, потому что length () работает только с текстами и прекращает считать после первого NULL. Мои эмпирические тесты показали, что это правда.

Я использую SQLite 3.4.2


Обновление:

Так что в SQLite 3.7.6 кажется, что функция length () возвращает правильное значение больших двоичных объектов - я проверял различные журналы изменений sqlite, но не видел, в какой версии это исправлено.

Из Sqlite 3.7.6:

payload_id|length(payload)|length(hex(payload))/2
1807913|194|194
1807914|171|171

Документация была изменена, чтобы отразить это.

length(X)   The length(X) function returns the length of X in characters if X is
            a string, or in bytes if X is a blob. If X is NULL then length(X) is
            NULL. If X is numeric then length(X) returns the length of a string 
            representation of X.

Ответы [ 5 ]

39 голосов
/ 30 октября 2008

не было этой проблемы, но вы можете попробовать length(hex(glob))/2

Обновление (август 2012 г.): Для SQLite 3.7.6 (выпущена 12 апреля 2011 г.) и более поздних версий length(blob_column) работает, как ожидается, как текстовые, так и двоичные данные.

10 голосов
/ 23 сентября 2010

для меня length(blob) работает просто отлично, дает такие же результаты, как и другие.

6 голосов
/ 08 августа 2015

В качестве дополнительного ответа, общая проблема заключается в том, что sqlite эффективно игнорирует тип столбца таблицы, поэтому, если вы сохраняете строку в столбце BLOB-объекта, он становится строковым столбцом для этой строки . Поскольку длина работает с строками по-разному, она будет возвращать только количество символов перед последним 0 октетом. Строки в столбцах BLOB-объектов легко хранить, поскольку для вставки BLOB-объектов обычно требуется явное приведение типов:

insert into table values ('xxxx'); // string insert
insert into table values(cast('xxxx' as blob)); // blob insert

чтобы получить правильную длину для значений, хранящихся в виде строки, вы можете привести аргумент длины к blob:

select length(string-value-from-blob-column); // treast blob column as string
select length(cast(blob-column as blob)); // correctly returns blob length

Причина, по которой работает length (hex (blob-column)) / 2, заключается в том, что hex не останавливается на внутренних 0 октетах, а сгенерированная шестнадцатеричная строка больше не содержит 0 октетов, поэтому length возвращает правильный (full ) длина.

4 голосов
/ 09 мая 2013

Пример запроса select, который делает это, получая длину большого двоичного объекта в столбце myblob, в таблице mytable, в строке 3:

select length(myblob) from mytable where rowid=3;
2 голосов
/ 21 февраля 2014

Функция LENGTH () в sqlite 3.7.13 на Debian 7 не работает, но LENGTH (HEX ()) / 2 работает нормально.

# sqlite --version
3.7.13 2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc

# sqlite xxx.db "SELECT docid, LENGTH(doccontent), LENGTH(HEX(doccontent))/2 AS b FROM cr_doc LIMIT 10;"
1|6|77824
2|5|176251
3|5|176251
4|6|39936
5|6|43520
6|494|101447
7|6|41472
8|6|61440
9|6|41984
10|6|41472
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...