当前位置: 首页 > news >正文

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

字符串中的 NUL 字符

1. 引言

SQLite 允许数据库存储的字符串值中间包含 NUL 字符(ASCII 0x00,Unicode \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. 意外行为

来看下面这段 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](cli.html) 已设置为 "[.mode quote](climode.html#dotmodequote)"。)但要是运行:
SELECT * FROM t1 WHERE b='abc';
则不会返回任何行。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,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));'
http://www.jsqmd.com/news/1199065/

相关文章:

  • FastGPT | 19 - 文件导入与数据源接入
  • 大学生降 AI 用哪个软件最合适?知网送审这款最稳 - 我要发一区
  • C++实战:基于Native Wifi API构建Windows WiFi状态监控与智能重连工具
  • 浪琴中国官方售后服务中心|全新服务电话及详细地址权威信息通知(2026年7月最新) - 浪琴服务中心
  • 螺纹杯不靠花哨,一圈圈都是手感
  • Python Pillow(PIL)库实战:从基础操作到图像合成与特效
  • STM32 CAN双机通信实战:从硬件连接到HAL库代码解析
  • 【2027最新】基于SpringBoot+Vue的驾校预约学习系统管理系统源码+MyBatis+MySQL
  • 2026年可靠的箱体护坡模具选购参考指南 - 奔跑123
  • 闲置大牌包包别乱卖!长沙专业回收门店行情实测 - 奢侈品回收机构参考
  • PID控制算法详解:原理、实现与工程应用
  • AI产品经理靠谱么?
  • 联想 ThinkPad 8550 Aura Edition 与捷波朗 Evolve3 75 商务耳机对比,谁更值得买?
  • 学工系统使用指南:如何下载和安装,以及常见问题解答
  • 6000次循环零衰减,全铁液流电池
  • 散户量化交易入门:从零搭建策略、规避风险到稳定盈利
  • OpenClaw 2026生产级部署手册:阿里云+本地双环境实战
  • 2025年C++工具链变革:静态分析从外围工具到核心能力的深度集成
  • 2026年7月硬核知名GEO系统哪个好榜单TOP5:六大维度横评帮你选对不踩坑 - 资讯焦点
  • 英文分词技术全解析:从基础原理到spaCy/NLTK工程实践
  • 2026年沈阳华硕笔记本电脑清灰服务维修中心哪家比较正规?行业深度测评 - 苹果手机电脑维修
  • 长沙六大商圈收金店横评,线上预估价与到店价对比 - 讯息早知道
  • 2026推荐:宁波厨房管道渗漏维修怎么选靠谱公司?多方对比测评,专业堵漏机构优选推荐 - 专注室内空气检测治理
  • 医疗远程会诊系统建设方案:助力多院区协同与专家资源共享
  • muduo网络库(三):日志输出
  • AO3镜像站完全指南:解锁全球同人创作宝库的实用方案
  • 面试官抬头:“你说你用Claude写代码,你说说你怎么维护CLAUDE.md”,我:“啊。。这是啥?”,面试官:“今天面试就到这吧”
  • 公考面试培训水有多深:从天价班到模板化教学,我花了五万块才看清的真相
  • 注意事项捏
  • ChatGPT for Excel:智能公式生成与数据分析实战指南