如何使用SQLite 3类型亲和力?

wgeznvg7  于 2023-08-06  发布在  SQLite
关注(0)|答案(3)|浏览(156)

SQLite 3 documentation声明“类型关联”强制执行列数据类型。但是怎么打开呢?

mlmc2os5

mlmc2os51#

类型关联并不强制列数据类型-它只是建议底层存储引擎如何存储数据。
在“类型亲和性”部分下:
列的类型关联是存储在该列中的数据的建议类型。这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。

  • (强调部分由作者标明)*

至于“如何打开它”,没有这样的事情。这就是SQLite一直以来的工作方式。为了获得此功能,无需打开或关闭任何东西。

kmbjn2e3

kmbjn2e32#

列数据类型不是强制的,只是由它们在create table语句中声明的类型 * 建议 * 的。这就是他们所说的“类型亲和性”。
列的类型关联是存储在该列中的数据的建议类型。这里的重要思想是,该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是有些列在选择的情况下更喜欢使用一个存储类而不是另一个。列的首选存储类称为其“亲和性”。

lbsnaicq

lbsnaicq3#

如果您想强制将列限制为特定类型,则可以切换到STRICT tables,这是3.37.0版本(2021-11-27)添加的功能。
启用此模式时,只能使用INT、INTEGER、真实的、TEXT、BLOB和ANY类型。您还将注意到,声明中的类型名(别名)的魔术提取(将unrealistic视为REAL)被禁用。
让我们通过SQLite命令行shell中的一个示例来说明这一点。

$ sqlite3
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .mode column
sqlite> CREATE TABLE screen_pos (x INT, y INTEGER) STRICT;

字符串
(Note名称INTINTEGER在表示相同类型时如何被保留。
以下查询照常工作,因为输入参数到整数的转换是有效的:

sqlite> INSERT INTO screen_pos VALUES (1, 2);
sqlite> INSERT INTO screen_pos VALUES ('3', '4');
sqlite> INSERT INTO screen_pos VALUES (5.0, 6.0);


尝试插入无法转换为整数的值将被拒绝:

sqlite> INSERT INTO screen_pos VALUES (1, 2.1);
Runtime error: cannot store REAL value in INTEGER column screen_pos.y (19)

sqlite> INSERT INTO screen_pos VALUES ('3', 'four');
Runtime error: cannot store TEXT value in INTEGER column screen_pos.y (19)

sqlite> INSERT INTO screen_pos VALUES ('5.1', 6);
Runtime error: cannot store REAL value in INT column screen_pos.x (19)


在表中,我们仍然存储了以下数据:

sqlite> SELECT * FROM screen_pos;
x  y
-  -
1  2
3  4
5  6

相关问题