Как найти длину (размер) бинарного блоба в sqlite

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

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

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


Обновление:

Так как SQLite 3.7.6 кажется, что функция length() возвращает правильное значение blobs - я проверил различные журналы изменений 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.

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

чтобы получить правильную длину для значений, хранящихся в виде строки, вы можете указать аргумент length в 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 октетов, поэтому длина возвращает правильную (полную ) длина.

Один символ, сохраненный в одном байте, может представлять собой две шестнадцатеричные строки.

Ответ 4

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

select length(myblob) from mytable where rowid=3;

Ответ 5

Функция 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