SQLite 字符串含 NUL 字符问题多,教你判断和移除!

发布时间:2026/10/31 18:53:29
SQLite 字符串含 NUL 字符问题多,教你判断和移除! 字符串中的 NUL 字符1. 引言SQLite 允许数据库存储的字符串值中间包含 NUL 字符ASCII 0x00Unicode \u0000。然而在字符串中使用 NUL 可能会引发一些意外状况其一[length() SQL 函数](lang_corefunc.html#length) 仅统计到第一个 NUL 字符不包括该字符之前的字符数量其二[quote() SQL 函数](lang_corefunc.html#quote) 只显示到第一个 NUL 字符不包括该字符之前的字符其三[CLI](cli.html) 中的 [.dump](cli.html#dump) 命令在生成的 SQL 输出中会省略第一个 NUL 字符以及其后的所有文本实际上[CLI](cli.html) 在所有情况下都会省略第一个 NUL 字符之后的所有内容。所以不建议在 SQL 文本字符串中使用 NUL 字符。2. 意外行为来看下面这段 SQLCREATE TABLE t1( a INTEGER PRIMARY KEY, b TEXT ); INSERT INTO t1(a,b) VALUES(1, abc||char(0)||xyz); SELECT a, b, length(b) FROM t1;上述 SELECT 语句的输出为1,abc,3这里假设 [CLI](cli.html) 已设置为 [.mode quote](climode.html#dotmodequote)。但要是运行SELECT * FROM t1 WHERE babc;则不会返回任何行。SQLite 知道 t1.b 列实际存储的是一个 7 字符的字符串而 7 字符的字符串 abc||char(0)||xyz 不等于 3 字符的字符串 abc所以不会返回任何行。可这可能会让用户感到困惑因为 [CLI](cli.html) 的输出似乎显示该字符串只有 3 个字符。这看似是个 bug但这就是 SQLite 的运行方式。3. 如何判断字符串中是否有 NUL 字符若使用 [CAST](lang_expr.html#castexpr) 将字符串转换为 BLOB就能看到字符串的完整长度。例如SELECT a, CAST(b AS BLOB) FROM t1;结果如下1,X6162630078797a在 BLOB 输出中可以清晰地看到 NUL 字符是 7 字符字符串中的第 4 个字符。还有一种更自动化的方法是使用如下表达式判断字符串值 X 是否包含嵌入的 NUL 字符instr(X,char(0))如果该表达式返回非零值 N则表明在第 N 个字符位置存在嵌入的 NUL 字符。因此要统计包含嵌入 NUL 字符的行数可以使用以下语句SELECT count(*) FROM t1 WHERE instr(b,char(0))0;4. 从文本字段中移除 NUL 字符下面的示例展示了如何从表的某一列中移除 NUL 字符及其后面的所有文本。所以如果你有一个包含嵌入 NUL 字符的数据库文件并且想移除它们运行类似以下的 UPDATE 语句或许会有帮助UPDATE t1 SET bsubstr(b,1,instr(b,char(0))) WHERE instr(b,char(0));

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询