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 很可能会增加额外的输出信息:
- schema:表和视图所在的模式(例如 main 或者 temp)。
- name:表和视图的名称。
- type:对象的类型,包括table、view、shadow(shadow table)或者 virtual(虚拟表)。
- ncol:表中包含的字段数量,包括生成列和隐藏列
- wr:1 表示该表是一个 WITHOUT ROWID 表,0 表示普通表。
- 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 发布,支持严格的字段数据类型的主要内容,如果未能解决你的问题,请参考以下文章