SQLite 开发团队于 2023 年 08 月 24 日发布了 SQLite 3.43.0 版本。本文给大家分析一下该版本的更新。
SQLite 3.43.0 增加了 Contentless-Delete FTS5 索引。这是一种 FTS5 全文索引的变种,不存储被索引的内容,同时支持数据的删除操作。
例如:
CREATE VIRTUAL TABLE f1 USING fts5(a, b, c, content='', contentless_delete=1);
Contentless-delete 表与 Contentless 表的区别在于:
例如:
-- 支持以下 UPDATE 语句
UPDATE f1 SET a=?, b=?, c=? WHERE rowid=?;
-- 不支持以下 UPDATE 语句,因为字段 c 没有指定新的数据
UPDATE f1 SET a=?, b=? WHERE rowid=?;
除非存在旧版本的后向兼容需求,推荐使用 Contentless-delete 表。
新版本增强了日期时间相关的函数。首先是增加了“±YYYY-MM-DD HH:MM:SS.SSS”形式的时间偏移量,例如:
select date('2023-01-01', '+1000-01-01');
3023-02-02
其次,新版本增加了 timediff(A, B) 函数,计算从时间 B 到达时间 A 所需的时间。例如:
select timediff('2023-06-01', '2023-01-01');
+0000-05-00 00:00:00.000
timediff() 函数返回的格式是字符串,方便阅读。如果想要返回精确的时间差(天数、秒数等),可以使用两个 julianday() 或 unixepoch() 函数相减。
SQLite 3.43.0 增加了一个 octet_length(X) 字符串函数,用于返回字符串 X 占用的字节数。例如:
select octet_length('Hello');
5
select octet_length('你好');
6
octet_length(X) 以字节为单位,而不是字符为单位。因此,不同数据库字符集可能返回不同的长度。
SQLite 3.43.0 新增了一个 sqlite3_stmt_explain(S,E) API,用于改变预编译语句的 EXPLAIN 设置。
如果参数 E 设置为 0,S 就是一个普通的预编译语句;如果 E 设置为 1,S 就变成一个以 EXPLAIN 开始的 SQL 语句;如果E 设置为 2,S 就变成一个以 EXPLAIN QUERY PLAN 开始的 SQL 语句。
查询优化器增强包括:
新版本增强了与 decimal 扩展相关的内容:
例如:
select decimal_pow2(10);
+1.024e+03
select decimal_exp(12.3);
+1.2300000000000000710542735760100185871124267578125e+01
select decimal(12.3);
12.300000000000000710542735760100185871124267578125
某些情况下,对于大型 JSON 字符串的处理性能获得翻倍提升。