SQLite中Blob字面量x'007800'的含义是什么?
SQLite中x'007800'的含义解析
SQLite的BLOB类型与字面量写法
- SQLite支持BLOB数据类型,该类型以十六进制形式存储数据
- 可通过
x'<十六进制数>'(或大写X'<十六进制数>')格式编写BLOB字面量
SQLite官方文档对BLOB字面量的定义:
BLOB字面量是前缀为单个"x"或"X"字符、包含十六进制数据的字符串字面量。示例:X'53514C697465'
举个简单例子,在SQLite命令行执行以下命令:
sqlite> SELECT x'313233'; 123 sqlite>
SQLite会自动将十六进制的31、32、33转换为对应的ASCII字符——即十进制49、50、51代表的"1"、"2"、"3"。
遇到的问题
我在维护他人编写的测试套件时,发现某个测试用例使用x'007800',还声称它是某种NULL值。但实际在SQLite控制台执行该语句时,没有任何可见输出:
sqlite> SELECT x'007800'; sqlite>
我对这个十六进制值的含义感到困惑,搜索不到它的特殊意义,它对应的字节序列是"\0x\0",同样无法理解其含义。
含义解析
1. 核心本质
x'007800'不是任何特殊的NULL值,它就是一个普通的BLOB数据,对应的三个字节分别是:
00:ASCII空字符(NUL,不可打印)78:ASCII小写字母x(十进制120,可打印)00:ASCII空字符(NUL,不可打印)
所以这个BLOB的实际内容是「空字符 + 小写x + 空字符」,也就是你看到的"\0x\0"。
2. 控制台无输出的原因
SQLite命令行工具(CLI)采用C语言风格的字符串处理逻辑——以NUL字符(0x00)作为字符串的结束标记。当BLOB的第一个字节就是0x00时,CLI会直接判定字符串结束,不会显示后续的x和第二个0x00,因此你看到的输出是空行。
3. 测试用例的误区
测试用例里声称x'007800'是某种NULL值,这是错误的认知。SQLite中的NULL是专门的空值类型,代表“不存在的值”,而x'007800'是一个包含有效字节的BLOB数据,二者完全不是同一概念。
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

