我有一个SQLite表,其中包含一个BLOB,我需要对它进行大小/长度检查。我该怎么做呢?根据文档,length(blob)只对文本有效,并且在第一个NULL之后停止计数。我的测试证实了这一点。我使用的是SQLite 3.4.2。
length(blob)
uinbv5nw1#
我没有遇到过这种问题,但您可以尝试length(hex(glob))/2
length(hex(glob))/2
length(blob_column)
xsuvu9jc2#
对我来说,length(blob)工作得很好,给出了和其他一样的结果。
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返回正确的(完整)长度。
z8dt9xmd4#
执行此操作的select查询示例,获取表mytable中第3行的列myblob中的blob的长度:
select
mytable
myblob
select length(myblob) from mytable where rowid=3;
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
5条答案
按热度按时间uinbv5nw1#
我没有遇到过这种问题,但您可以尝试
length(hex(glob))/2
length(blob_column)
可按预期处理文本和二进制数据。xsuvu9jc2#
对我来说,
length(blob)
工作得很好,给出了和其他一样的结果。ki0zmccv3#
另一个常见的问题是sqlite实际上忽略了表的列类型,因此如果在blob列中存储字符串,它将成为该行的 *string列 *。由于length对字符串的作用不同,它将只返回最后一个0八位字节之前的字符数。在blob列中存储字符串很容易,因为通常必须显式转换以插入blob:
要获取存储为字符串的值的正确长度,可以将length参数转换为blob:
length(hex(blob-column))/2之所以有效,是因为hex不会在内部0个八位字节处停止,并且生成的十六进制字符串不再包含0个八位字节,因此length返回正确的(完整)长度。
z8dt9xmd4#
执行此操作的
select
查询示例,获取表mytable
中第3行的列myblob
中的blob的长度:du7egjpx5#
Debian 7上sqlite 3.7.13中的LENGTH()函数无法正常工作,但LENGTH(HEX())/2可以正常工作。