详解 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,