我有一个包含BLOB文件的sqlite表,但需要对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

文档已更改以反映此情况。

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(hex(glob))/ 2

更新(2012年8月): 对于SQLite 3。7。6(2011年4月12日发布)及更高版本, length(blob_column)按预期方式处理文本和二进制数据。

其他提示

对我来说 length(blob)工作正常,给出与其他结果相同的结果。

作为一个额外的答案,一个常见的问题是sqlite有效地忽略了表的列类型,因此如果将字符串存储在blob列中,它将成为该行的字符串列。由于长度在字符串上的工作方式不同,因此它只返回最后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

长度(十六进制(blob-column))/ 2工作的原因是十六进制不在内部0个八位字节停止,并且生成的十六进制字符串不再包含0个八位字节,因此长度返回正确(完整) )长度。

执行此操作的 select 查询示例,在第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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top