SQLite自动增量也就是自增主键设置:列的类型设为为 INTEGER并设置为PRIMARY KEY ,则此列数字自动增长,sqlite3 中名为rowid ,AUTOINCRMENT 关键字会施加额外的 CPU、内存、磁盘空间, 和磁盘 I/O 开销,如果不是严格需要的话应该避免。 通常不需要它。
大多数 SQL 数据库引擎(除 SQLite 之外的每个 SQL 数据库引擎, 据我们所知)使用静态、严格的类型。对于静态类型,数据类型 值的大小由其容器决定 - 中的特定列 该值被存储。
SQLite 使用更通用的动态类型系统。在 SQLite 中,数据类型 值的属性与值本身相关联,而不是与其容器相关联。 SQLite的动态类型系统是落后的 与其他数据库引擎的更常见的静态类型系统兼容 从某种意义上说,适用于静态类型数据库的 SQL 语句 在 SQLite 中也以同样的方式工作。然而,SQLite 中的动态类型允许 它可以做传统严格类型中不可能完成的事情 数据库。 灵活的类型是 SQLite 的一个特性,而不是一个错误。
更新: 从版本 3.37.0 (2021-11-27) 开始,SQLite 提供 STRICT 表 对于喜欢这种事情的开发人员来说,它会执行严格的类型强制。
每个值存储在 SQLite 数据库中(或由 数据库引擎)具有以下存储类别之一:
存储类比数据类型更通用。 例如,INTEGER存储类包括7种不同的整数 不同长度的数据类型。 这会对磁盘产生影响。 但是,一旦 INTEGER 值从磁盘读取到内存中, 处理,它们被转换为最通用的数据类型 (8 字节有符号整数)。 因此在大多数情况下,“存储类”与 “数据类型”和这两个术语可以互换使用。
SQLite 版本 3 数据库中的任何列, 除 INTEGER PRIMARY KEY 列外,可用于存储值 任何存储类别。
SQL 语句中的所有值,无论它们是嵌入在 SQL 中的文字 语句文本或 参数 绑定到的 预编译的SQL语句 有一个隐式存储类。 在下述情况下, 数据库引擎可以在数字存储类之间转换值 查询执行期间的(INTEGER 和 REAL)和 TEXT。
SQLite 没有单独的布尔存储类。 相反,布尔值存储为整数 0(假)和 1(真)。
SQLite 识别关键字“TRUE”和“FALSE”, 自版本 3.23.0 (2018-04-02) 起,但这些关键字是 实际上只是整数文字 1 和 0 的替代拼写 分别。
SQLite 没有为存储预留存储类 日期和/或时间。 相反,SQLite 的内置 日期和时间函数 能够 将日期和时间存储为 TEXT、REAL 或 INTEGER 值:
应用程序可以选择将日期和时间存储在其中任何一个中 格式并使用内置的格式之间自由转换 日期和时间函数 。
使用严格类型的 SQL 数据库引擎通常会尝试 自动将值转换为适当的数据类型。考虑一下:
创建表 t1(a INT, b VARCHAR(10));
插入 t1(a,b) 值('123',456);
刚性类型数据库会将字符串“123”转换为 整数 123 和整数 456 转换为字符串 '456' 之前 做插入。
为了最大限度地提高SQLite与其他数据库的兼容性 引擎,这样上面的示例就可以在 SQLite 上运行 在其他 SQL 数据库引擎上, SQLite 支持列上“类型关联”的概念。 列的类型关联是存储数据的推荐类型 在那一栏里。这里重要的想法是推荐类型,而不是 必需的。任何列仍然可以存储任何类型的数据。 只是有些栏目在有选择的情况下会更喜欢使用 一种存储类别优于另一种存储类别。首选存储类别 一个列被称为它的“亲和力”。
SQLite 3 数据库中的每一列都分配有以下之一 以下类型亲和力:
(历史注释:“BLOB”类型亲和力过去被称为“NONE”。 但这个词很容易与“没有亲和力”混淆,所以它是 重命名。)
具有 TEXT 关联性的列使用存储类存储所有数据 NULL、文本或 BLOB。如果将数值数据插入到列中 TEXT 亲和性它在存储之前转换为文本形式。
具有 NUMERIC 亲和力的列可能包含使用所有五个的值 存储类。当文本数据插入到 NUMERIC 列时, 文本的存储类别转换为 INTEGER 或 REAL(按顺序) 偏好)如果文本分别是格式正确的整数或实数文字。 如果 TEXT 值是格式良好的整数文字,但太大 为了适合 64 位有符号整数,它被转换为 REAL。 对于 TEXT 和 REAL 存储类之间的转换,只有第一个 保留该数字的 15 位有效十进制数字。 如果 TEXT 值不是格式良好的整数或实数文字, 然后该值存储为 TEXT。 就本段而言,十六进制整数 文字不被认为是格式正确的,并且存储为 TEXT。 (这样做是为了与 SQLite 版本的历史兼容性 2014-08-15之前的 3.8.6 版本,其中十六进制整数 文字首先被引入 SQLite。) 如果可以精确表示为整数的浮点值 插入到具有 NUMERIC 亲和力的列中,值为 转换为整数。 不会尝试转换 NULL 或 BLOB 值。
字符串可能看起来像浮点文字 小数点和/或指数符号,但只要 该值可以表示为整数,NUMERIC 亲和力将转换 将其转化为整数。因此,字符串“3.0e+5”存储在 具有 NUMERIC 关联性的列为整数 300000,而不是浮动 点值 300000.0。
使用 INTEGER 亲和力的列的行为与列相同 具有数字亲和力。 INTEGER 和 NUMERIC 亲和力之间的区别 中明显 仅在CAST 表达式 :表达式 “CAST(4.0 AS INT)”返回整数 4,而 “CAST(4.0 AS NUMERIC)”将该值保留为浮点 4.0。
具有 REAL 亲和力的列的行为类似于具有 NUMERIC 的列 相似性,除了它强制整数值转换为浮点值 表示。 (作为内部优化,小浮点 没有小数部分并存储在 REAL 列中的值 亲和力以整数形式写入磁盘,以减少占用空间 空间并自动转换回浮点数,如下所示 值被读出。 这种优化在SQL层面是完全不可见的,只能 通过检查数据库文件的原始位来检测。)
具有关联性 BLOB 的列并不比某个存储类更喜欢 另一个,并且没有尝试将数据从一个存储类强制转换为 其他。