sqlite3 数据类型介绍,自增主键设置

SQLite 使用更通用的动态类型系统。在 SQLite 中,数据类型 值的属性与值本身相关联,而不是与其容器相关联。 SQLite的动态类型系统是落后的 与其他数据库引擎的更常见的静态类型系统兼容 从某种意义上说,适用于静态类型数据库的 SQL 语句 在 SQLite 中也以同样的方式工作。然而,SQLite 中的动态类型允许 它可以做传统严格类型中不可能完成的事情 数据

SQLite自动增量也就是自增主键设置:列的类型设为为 INTEGER并设置为PRIMARY KEY ,则此列数字自动增长,sqlite3 中名为rowid ,AUTOINCRMENT 关键字会施加额外的 CPU、内存、磁盘空间, 和磁盘 I/O 开销,如果不是严格需要的话应该避免。 通常不需要它。

1. SQLite 中的数据类型

大多数 SQL 数据库引擎(除 SQLite 之外的每个 SQL 数据库引擎, 据我们所知)使用静态、严格的类型。对于静态类型,数据类型 值的大小由其容器决定 - 中的特定列 该值被存储。

SQLite 使用更通用的动态类型系统。在 SQLite 中,数据类型 值的属性与值本身相关联,而不是与其容器相关联。 SQLite的动态类型系统是落后的 与其他数据库引擎的更常见的静态类型系统兼容 从某种意义上说,适用于静态类型数据库的 SQL 语句 在 SQLite 中也以同样的方式工作。然而,SQLite 中的动态类型允许 它可以做传统严格类型中不可能完成的事情 数据库。 灵活的类型是 SQLite 的一个特性,而不是一个错误。 

更新: 从版本 3.37.0 (2021-11-27) 开始,SQLite 提供 STRICT 表 对于喜欢这种事情的开发人员来说,它会执行严格的类型强制。


2. 存储类和数据类型

每个值存储在 SQLite 数据库中(或由 数据库引擎)具有以下存储类别之一:

  • null 。 该值为 NULL 值。
  • integer 。该值为有符号整数,存储在0、1、 2、3、4、6 或 8 个字节,具体取决于值的大小。
  • real。该值是一个浮点值,存储为 8 字节 IEEE 浮点数。
  • text 。该值是一个文本字符串,使用 数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)。
  • blob 。该值是一个数据块,存储方式完全相同 它被输入了。

存储类比数据类型更通用。 例如,INTEGER存储类包括7种不同的整数 不同长度的数据类型。 这会对磁盘产生影响。 但是,一旦 INTEGER 值从磁盘读取到内存中, 处理,它们被转换为最通用的数据类型 (8 字节有符号整数)。 因此在大多数情况下,“存储类”与 “数据类型”和这两个术语可以互换使用。

SQLite 版本 3 数据库中的任何列, 除 INTEGER PRIMARY KEY 列外,可用于存储值 任何存储类别。

SQL 语句中的所有值,无论它们是嵌入在 SQL 中的文字 语句文本或 参数 绑定到的 预编译的SQL语句 有一个隐式存储类。 在下述情况下, 数据库引擎可以在数字存储类之间转换值 查询执行期间的(INTEGER 和 REAL)和 TEXT。




2.1. 布尔数据类型

SQLite 没有单独的布尔存储类。 相反,布尔值存储为整数 0(假)和 1(真)。

SQLite 识别关键字“TRUE”和“FALSE”, 自版本 3.23.0 (2018-04-02) 起,但这些关键字是 实际上只是整数文字 1 和 0 的替代拼写 分别。


2.2. 日期和时间数据类型

SQLite 没有为存储预留存储类 日期和/或时间。 相反,SQLite 的内置 日期和时间函数 能够 将日期和时间存储为 TEXT、REAL 或 INTEGER 值:

  • TEXT 作为 ISO8601 字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
  • REAL 作为儒略日数,自此以来的天数 根据《公元前 4714 年 11 月 24 日中午在格林威治》 公历。
  • INTEGER 作为 Unix 时间,自此以来的秒数 1970 年 1 月 1 日 00:00:00 世界标准时间。

应用程序可以选择将日期和时间存储在其中任何一个中 格式并使用内置的格式之间自由转换 日期和时间函数


3. 类型亲和力

使用严格类型的 SQL 数据库引擎通常会尝试 自动将值转换为适当的数据类型。考虑一下:

创建表 t1(a INT, b VARCHAR(10));
插入 t1(a,b) 值('123',456);
 

刚性类型数据库会将字符串“123”转换为 整数 123 和整数 456 转换为字符串 '456' 之前 做插入。

为了最大限度地提高SQLite与其他数据库的兼容性 引擎,这样上面的示例就可以在 SQLite 上运行 在其他 SQL 数据库引擎上, SQLite 支持列上“类型关联”的概念。 列的类型关联是存储数据的推荐类型 在那一栏里。这里重要的想法是推荐类型,而不是 必需的。任何列仍然可以存储任何类型的数据。 只是有些栏目在有选择的情况下会更喜欢使用 一种存储类别优于另一种存储类别。首选存储类别 一个列被称为它的“亲和力”。

SQLite 3 数据库中的每一列都分配有以下之一 以下类型亲和力:

  • 文本
  • 数字
  • 整数
  • 真实的
  • BLOB

(历史注释:“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 的列并不比某个存储类更喜欢 另一个,并且没有尝试将数据从一个存储类强制转换为 其他。 

© GVGNN 2013-2026