一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

字符串中的 NUL 字元

时间:2026-07-16 17:43:55 编辑:袖梨 来源:一聚教程网

SQLite 允许在数据库中存储的字符串值中间使用 NUL 字符(ASCII 0x00、Unicode u0000)。然而,在字符串中使用 NUL 可能会导致令人惊讶的行为:

字符串中的 NUL 字符

  1. length() SQL 函数仅计算第一个 NUL 之前的字符(不包括第一个 NUL)。
  2. quote() SQL 函数仅显示第一个 NUL 之前的字符(不包括第一个 NUL)。
  3. CLI 中的 .dump 命令会忽略它生成的 SQL 输出中的第一个 NUL 字符及其所有后续文本。事实上,CLI 在所有上下文中都会忽略第一个 NUL 字符之后的所有内容。

不建议在 SQL 文本字符串中使用 NUL 字符。

考虑以下 SQL:

上面的 SELECT 语句显示了以下输出:

(在本文档中,我们假设 CLI 设置了“.mode quote”。)但是如果您运行:

然后不会返回任何行。 SQLite 知道 t1.b 列实际上包含 7 个字符的字符串,并且 7 个字符的字符串 'abc'||char(0)||'xyz' 不等于 3 个字符的字符串 'abc',因此不会返回任何行。但用户可能很容易对此感到困惑,因为 CLI 输出似乎显示该字符串只有 3 个字符。这似乎是一个错误。但这就是 SQLite 的工作原理。

如果将字符串 CAST 为 BLOB,则会显示该字符串的整个长度。例如:

给出这个结果:

在 BLOB 输出中,您可以清楚地看到 NUL 字符是 7 个字符的字符串中的第 4 个字符。

另一种更自动化的判断字符串值 X 是否包含嵌入的 NUL 字符的方法是使用如下表达式:

如果此表达式返回非零值 N,则第 N 个字符位置存在嵌入的 NUL。因此,要计算包含嵌入 NUL 字符的行数:

以下示例演示如何从表的列中删除 NUL 字符及其后面的所有文本。因此,如果您有一个包含嵌入式 NUL 的数据库文件并且您想要删除它们,运行类似于以下内容的 UPDATE 语句可能会有所帮助:

本页面最后更新于 2022-05-23 22:21:54Z

热门栏目