SQLite 3.37.0 发布,支持严格的字段数据类型


大家好,我是只谈技术不剪发的 Tony 老师。

嵌入式数据库 SQLite 开发团队于 2021 年 11 月 27 日发布了 SQLite 3.37.0 版本。该版本最大的更新就是支持严格的表字段数据类型,本文给大家逐一进行分析。

如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁

严格的字段数据类型

SQLite 默认使用灵活的数据类型。例如,某个表的字段类型为 INTEGER,SQLite 存储数据时会尝试将插入该列的值转换为整数。因此,插入字符串“123”的结果是存储了整数 123。不过,如果无法将插入的数据无损地转换为整数,例如,如果输入为“xyz”,则将插入原始字符串。更多相关内容,可以参考 SQLite 文档中的数据类型

一些开发人员认为 SQLite 灵活的类型规则很好,但是另一些开发人员对此感到奇怪,他们认为 SQL 标准和其他数据库中的严格数据类型更好。对于后者而言,SQLite 3.37.0 开始支持这种严格的数据类型,该功能可以基于表级别指定。

例如:

-- SQlite 3.37.0 之前的版本
CREATE TABLE t(id integer);
INSERT INTO t VALUES ('123'), ('abc');

SELECT * FROM t;
id |
---+
123|
abc|

-- SQLite 3.37.0
CREATE TABLE t(id integer) STRICT;
INSERT INTO t VALUES ('123');

INSERT INTO t VALUES ('abc');
Error: stepping, cannot store TEXT value in INTEGER column t.id (19)

SELECT * FROM t;
id |
---+
123|

关于该功能的详细介绍,可以参考官方文档

增加字段时校验

当我们使用 ALTER TABLE ADD COLUMN 命令增加字段时,如果增加的字段存在 CHECK 约束,或者生成列包含 NOT NULL 约束,SQLite 将会检查已有数据是否满足这些新的约束,如果不满足则返回错误。例如:

CREATE TABLE t1(id integer, col1 integer);
INSERT INTO t1 values(1,null);

ALTER TABLE t1 ADD col2 integer NOT NULL GENERATED ALWAYS AS (col1*col1);
Error: stepping, NOT NULL constraint failed (1)

PRAGMA table_list 语句

SQLite 3.37.0 增加了以下编译指定:

PRAGMA table_list;
PRAGMA schema.table_list;
PRAGMA table_list(table-name);

该编译指令返回指定模式下的表和视图信息,每个表一行数据。例如:

sqlite> PRAGMA table_list;
main|t1|table|2|0|0
main|t|table|1|0|1
main|sqlite_schema|table|5|0|0
temp|sqlite_temp_schema|table|5|0|0

当前版本 table_list 指令返回的信息如下,未来 SQLite 很可能会增加额外的输出信息:

  1. schema:表和视图所在的模式(例如 main 或者 temp)。
  2. name:表和视图的名称。
  3. type:对象的类型,包括table、view、shadow(shadow table)或者 virtual(虚拟表)。
  4. ncol:表中包含的字段数量,包括生成列和隐藏列
  5. wr:1 表示该表是一个 WITHOUT ROWID 表,0 表示普通表。
  6. strict:1 表示该表是一个拥有严格字段类型的表,0 表示动态类型的表。

默认命令会显示所有模式下的表。如果指定了 schema.,只显示该模式下的表。如果指定了 table-name 参数,只返回该表的信息。

CLI 增强

该版本中的命令行工具增强如下:

  • 增加了 .connection 命令,允许命令行工具同时打开多个数据库连接。
  • 增加了 –safe 命令行选项,可以用于禁止可能对计算机文件(非当前数据库文件)产生副作用的点号命令和 SQL 语句。
  • 改善多行 SQL 语句读取时的性能。

C 语言接口

增加了 C 语言的 sqlite3_autovacuum_pages() 接口,sqlite3_changes64() 接口以及 sqlite3_total_changes64() 接口。

文档中记录了关于 sqlite3_deserialize() 从未支持 TEMP 数据库的说明。

sqlite3_open_v2() 接口增加了 SQLITE_OPEN_EXRESCODE 标志选项。

查询计划器

如果在子查询或者视图中删除 ORDER BY 子句不会改变查询的语义,查询计划器将会忽略该子句。

generate_series 表值函数

generate_series 表值函数的第一个参数(START)修改为必选参数。如果想要使用以前的方式,可以使用 -DZERO_ARGUMENT_GENERATE_SERIES 编译时选项。

内存优化

SQLite 3.37.0 使用更少的内存存储数据库模式信息。

总结

SQLite 仍然在不断增加新的特性,赶快点击下载最新版使用吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值