如何在sqlite中找到二进制blob的长度(大小)

如何在sqlite中找到二进制blob的长度(大小),sqlite,size,blob,Sqlite,Size,Blob,我有一个sqlite表,其中包含一个BLOB文件,但需要对BLOB进行大小/长度检查,我该怎么做 根据我发现的一些文档,使用length(blob)是行不通的,因为length()只对文本起作用,在第一个NULL之后将停止计数。我的经验测试表明这是正确的 我使用的是SQLite 3.4.2 更新: 因此,从SQLite 3.7.6开始,似乎length()函数返回了正确的blob值-我检查了SQLite的各种更改日志,但没有看到在哪个版本中纠正了这一点 摘自Sqlite 3.7.6: payl

我有一个sqlite表,其中包含一个BLOB文件,但需要对BLOB进行大小/长度检查,我该怎么做

根据我发现的一些文档,使用length(blob)是行不通的,因为length()只对文本起作用,在第一个NULL之后将停止计数。我的经验测试表明这是正确的

我使用的是SQLite 3.4.2


更新:

因此,从SQLite 3.7.6开始,似乎length()函数返回了正确的blob值-我检查了SQLite的各种更改日志,但没有看到在哪个版本中纠正了这一点

摘自Sqlite 3.7.6:

payload_id|length(payload)|length(hex(payload))/2 1807913|194|194 1807914|171|171 有效载荷| id |长度(有效载荷)|长度(十六进制(有效载荷))/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. length(X)如果X为,则length(X)函数返回X的长度(以字符为单位) 字符串,如果X是blob,则以字节为单位。如果X为NULL,则长度(X)为 无效的如果X是数字,那么length(X)返回字符串的长度 X的表示。
没有这个问题,但您可以尝试
length(hex(glob))/2

更新(2012年8月):
对于SQLite 3.7.6(2011年4月12日发布)和更高版本,
length(blob_列)
在文本和二进制数据上都能按预期工作。

对于我来说
length(blob)
工作得很好,给出的结果与其他查询相同。

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

select length(myblob) from mytable where rowid=3;
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

另外一个问题是,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个八位字节,因此length返回正确的(完整)长度。

对于二进制blob?这将违反SQLite文档的规定,SQLite文档规定blob被视为文本,因此length()仅在找到
\0
字符之前是准确的。当前文档中的说明是“如果X是字符串,length(X)函数返回X的字符长度,如果X是blob,则返回X的字节长度。”