sqlite 如何计算二进制blob的长度(大小)?

oipij1gg  于 2022-11-24  发布在  SQLite
关注(0)|答案(5)|浏览(181)

我有一个SQLite表,其中包含一个BLOB,我需要对它进行大小/长度检查。我该怎么做呢?
根据文档,length(blob)只对文本有效,并且在第一个NULL之后停止计数。我的测试证实了这一点。我使用的是SQLite 3.4.2。

uinbv5nw

uinbv5nw1#

我没有遇到过这种问题,但您可以尝试length(hex(glob))/2

    • 更新(2012年8月):**对于SQLite 3.7.6(2011年4月12日发布)及更高版本,length(blob_column)可按预期处理文本和二进制数据。
xsuvu9jc

xsuvu9jc2#

对我来说,length(blob)工作得很好,给出了和其他一样的结果。

ki0zmccv

ki0zmccv3#

另一个常见的问题是sqlite实际上忽略了表的列类型,因此如果在blob列中存储字符串,它将成为该行的 *string列 *。由于length对字符串的作用不同,它将只返回最后一个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个八位字节,因此length返回正确的(完整)长度。

z8dt9xmd

z8dt9xmd4#

执行此操作的select查询示例,获取表mytable中第3行的列myblob中的blob的长度:

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

du7egjpx5#

Debian 7上sqlite 3.7.13中的LENGTH()函数无法正常工作,但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

相关问题