相关文章推荐
不拘小节的太阳  ·  LocalDate/LocalDateTim ...·  2 月前    · 
儒雅的皮带  ·  AttributeError: ...·  5 月前    · 
微笑的香烟  ·  PRML:Pattern ...·  1 年前    · 
发呆的蚂蚁  ·  html - @Media print ...·  1 年前    · 

详解 SQLite 数据类型

SQLite 数据类型的关键词是:动态类型。

几乎所有的 DB,都采用严格的静态类型。类型为 string 的字段,不允许存入 int 类型的值。而动态类型的 SQLite 是允许「将字段类型声明为 string,但却存入一个 int 值」的。SQLite 定义了一整套规则用于实现动态类型。为了理解这套规则,我们需要明白 SQLite 的两个术语: storage class 与 type affinity。

storage class

storage class 是数据存储到磁盘时的实际类型。

  • NULL. The value is a NULL value.
  • INTEGER. The value is a signed integer, stored in 0, 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
  • REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
  • TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
  • BLOB. The value is a blob of data, stored exactly as it was input.

SQLite 提供了 typeof 函数,以查看实际存储的类型。我们可以试验一下:

> CREATE TABLE settings (
    name text unique,
    value blob not null
> insert into settings(name, value)
  values('author', 'xiguaza'), ('score', 12.3), ('max_page', 800);
> select name, value, typeof(value) from settings;
name      value    typeof(value)
--------  -------  -------------
author    xiguaza  text
score     12.3     real
max_page  800      integer

可以看到, value 字段虽然被声明为 blob ,但其实际存在的值,却是多种多样的。

类型声明与 type affinity

使用 SQL 建表时,可以为字段声明类型,如:

CREATE TABLE user (
  id INTEGER PRIMARY KEY,