Как найти длину (размер) бинарного блоба в 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