SQLite3文本字段含\0二进制数据的查询异常问题
解决SQLite中TEXT字段存储含\0空字符导致字符串截断的问题
这问题我之前踩过坑!核心原因是你用了TEXT类型存储包含空字符(\0)的数据——SQLite对TEXT类型的处理遵循C语言字符串规则,遇到第一个\0就会截断后续内容,所以不管用substr还是其他字符串函数,都没法访问\0之后的部分。
解决方案:改用BLOB类型存储二进制数据
SQLite的BLOB类型是按原始字节流存储的,不会把\0当作结束符,完全能保留所有二进制内容。你可以按以下步骤修改表结构:
- 创建新表,将
Data字段类型改为BLOB:
CREATE TABLE Record_new (RecordID INTEGER, Data BLOB, PRIMARY KEY (RecordID));
- 迁移旧数据到新表:
INSERT INTO Record_new SELECT RecordID, Data FROM Record;
- 替换原表:
DROP TABLE Record; ALTER TABLE Record_new RENAME TO Record;
之后插入数据时,要确保以二进制方式传入(比如在代码中把字符串/字节数组当作BLOB参数绑定,不同语言的处理方式略有不同,比如Python中直接传入bytes类型即可)。
验证效果
修改后再执行你的查询:
SELECT substr(Data, 11, 5) FROM Record会正确返回\0之后的内容(比如你的例子中应该是with)SELECT substr(Data, 4, 10) FROM Record也能包含\0及后续的部分字节
为什么TEXT类型不行?
SQLite的TEXT字段存储的是UTF-8编码的字符串,其字符串处理函数(包括substr)都是基于C风格字符串实现的——这类函数会把\0视为字符串的结束标记,因此一旦遇到\0,就会停止处理后续内容,导致你看到的截断问题。
内容的提问来源于stack exchange,提问作者Loïc
相关产品推荐
相关产品推荐

