如何找到二进制 blob 的长度(大小)?

问题描述 投票:0回答:6

我有一个 SQLite 表,其中包含一个 BLOB,我需要对其进行大小/长度检查。我该怎么做?

根据文档

length(blob)
仅适用于文本,并且在第一个NULL后将停止计数。我的测试证实了这一点。我正在使用 SQLite 3.4.2。

sqlite size blob
6个回答
60
投票

我没有遇到过这个问题,不过你可以尝试一下

length(hex(glob))/2

更新(2012 年 8 月): 对于 SQLite 3.7.6(2011 年 4 月 12 日发布)及更高版本,

length(blob_column)
可以按预期处理文本和二进制数据。


13
投票

对我来说

length(blob)
工作得很好,给出了与其他相同的结果。


10
投票

作为一个额外的答案,一个常见的问题是 sqlite 有效地忽略了表的列类型,因此如果您将字符串存储在 blob 列中,它就会成为该行的字符串列。由于 length 对字符串的作用不同,因此它只会返回最后 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 返回正确的(完整)长度.


4
投票

执行此操作的

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

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

2
投票

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

0
投票

虽然

length()
应该返回 BLOB 的字节,但 这个答案 解释了为什么它可能不会。一种方法是在表上使用
STRICT
子句。另一种方法是使用最近在 3.43.1
中添加的 
octet_length()

© www.soinside.com 2019 - 2024. All rights reserved.