You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite3文本字段含\0二进制数据的查询异常问题

解决SQLite中TEXT字段存储含\0空字符导致字符串截断的问题

这问题我之前踩过坑!核心原因是你用了TEXT类型存储包含空字符(\0)的数据——SQLite对TEXT类型的处理遵循C语言字符串规则,遇到第一个\0就会截断后续内容,所以不管用substr还是其他字符串函数,都没法访问\0之后的部分。

解决方案:改用BLOB类型存储二进制数据

SQLite的BLOB类型是按原始字节流存储的,不会把\0当作结束符,完全能保留所有二进制内容。你可以按以下步骤修改表结构:

  1. 创建新表,将Data字段类型改为BLOB:
CREATE TABLE Record_new (RecordID INTEGER, Data BLOB, PRIMARY KEY (RecordID));
  1. 迁移旧数据到新表:
INSERT INTO Record_new SELECT RecordID, Data FROM Record;
  1. 替换原表:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:56:42