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

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 仍然在不断增加新的特性,赶快点击下载最新版使用吧!

以上是关于SQLite 3.37.0 发布,支持严格的字段数据类型的主要内容,如果未能解决你的问题,请参考以下文章

限制输入 SQLite3 的字符数

[转]SQLite支持字段类型及建表

Delphi中SQLite如何读写二进制字段(Blob类型)

SQLite 中是不是可以进行十进制数约束?

如何提高sqlite3的访问效率

SQLite -- 嵌入式关系型数据库