返回

文章详情

SQLite中的字符串中的NUL字符

Hacker News2026年7月15日 23:03

NUL字符在字符串中 1. 引言 SQLite允许在存储在数据库的字符串值中间使用NUL字符(ASCII 0x00,Unicode \u0000)。然而,在字符串中使用NUL可能会导致意想不到的行为: length() SQL函数仅计算到第一个NUL字符(不包括在内)的字符数。 quote() SQL函数仅显示到第一个NUL字符(不包括在内)的字符。 CLI中的.dump命令在生成的SQL输出中省略第一个NUL字符及其后所有文本。实际上,CLI在所有上下文中都会省略第一个NUL字符之后的所有内容。 不建议在SQL文本字符串中使用NUL字符。 2. 意外行为 考虑以下SQL: CREATE 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已设置为".mode quote")。但如果你运行: SELECT * FROM t1 WHERE b='abc'; 那么不会返回任何行。SQLite知道t1.b列实际存储的是一个7个字符的字符串,7个字符的字符串'abc'||char(0)||'xyz'与3个字符的字符串'abc'不相等,因此不会返回任何行。但用户可能会因此而感到困惑,因为CLI输出似乎显示该字符串只有3个字符。这看起来像是一个bug。但这就是SQLite的工作方式。 3. 如何判断字符串中是否有NUL字符 如果你将一个字符串转换为BLOB,那么会显示字符串的整个长度。例如: SELECT a, CAST(b AS BLOB) FROM t1; 会给出这个结果:1,X'6162630078797a' 在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 b=substr(b,1,instr(b,char(0))) WHERE instr(b,char(0)); 本页最后更新于2022-05-23 22:21:54Z

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡