54

我有一个包含 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) length(X) 函数返回 X 的字符长度,如果 X 是
            一个字符串,如果 X 是一个 blob,则以字节为单位。如果 X 为 NULL,则长度(X)为
            空值。如果 X 是数字,则 length(X) 返回字符串的长度
            X 的表示。
4

5 回答 5

58

没遇到过这个问题,你可以试试length(hex(glob))/2

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

于 2008-10-30T17:57:09.010 回答
11

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

于 2010-09-23T15:56:14.513 回答
9

作为附加答案,一个常见问题是 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

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

于 2015-08-08T16:45:01.140 回答
4

执行此操作的查询示例,获取第 3 行中 column 、 tableselect中 blob 的长度:myblobmytable

select length(myblob) from mytable where rowid=3;
于 2013-05-09T19:18:45.937 回答
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
于 2014-02-21T09:22:27.823 回答