SQLite 数据类型
SQLite 使用 动态类型,不同于传统的 SQL 数据库(如 MySQL、PostgreSQL)使用的静态类型。在 SQLite 中,一个列可以存储不同类型的数据,而不像 MySQL 那样严格限制。
1. SQLite 的存储类
SQLite 只有 五种存储类(Storage Classes),而不是传统 SQL 数据库的多个数据类型:
| 存储类 | 说明 |
|---|---|
NULL | 该值为空值(NULL)。 |
INTEGER | 有符号整数(1、2、3、100等),占用 1、2、3、4、6 或 8 字节。 |
REAL | 浮点数(小数),使用 8 字节存储。 |
TEXT | 文本字符串,UTF-8、UTF-16 编码。 |
BLOB | 二进制数据,存储为输入格式,适用于图片、文件等。 |
2. SQLite 的数据类型(类型亲和性)
SQLite 没有严格的数据类型,但它提供了一种类型亲和性(Type Affinity),用于保证数据存储的合理性。
SQLite 允许你在 CREATE TABLE 语句中指定数据类型,但这些类型会被映射到存储类。例如:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
balance REAL,
profile BLOB
);
在 SQLite 内部,INTEGER、REAL、TEXT、BLOB 实际上会映射到存储类。
SQLite 类型亲和性规则
SQLite 识别的数据类型会映射到五种存储类:
| 指定的数据类型 | 亲和类型(Affinity) |
|---|---|
INT, INTEGER, BIGINT, TINYINT | INTEGER |
REAL, FLOAT, DOUBLE, NUMERIC | REAL |
CHAR, TEXT, VARCHAR, CLOB | TEXT |
BLOB | BLOB |
BOOLEAN, DATE, DATETIME | NUMERIC |
例如:
CREATE TABLE test (
col1 INT, -- INTEGER
col2 VARCHAR(50), -- TEXT
col3 BOOLEAN, -- NUMERIC
col4 REAL, -- REAL
col5 BLOB -- BLOB
);
在 SQLite 中:
col1会被视为INTEGER,即使你写的是INT。col2会被视为TEXT,即使你写的是VARCHAR(50)。col3会被视为NUMERIC,但实际上 SQLite 仍允许存储整数。col4会被视为REAL,用于存储浮点数。col5直接存储二进制数据。
3. SQLite 特殊数据类型
SQLite 支持一些特殊数据类型,尽管它们仍然映射到五种存储类之一。
(1) BOOLEAN(布尔值)
SQLite 没有 BOOLEAN 类型,但可以用 INTEGER 存储:
CREATE TABLE settings (
id INTEGER PRIMARY KEY,
is_enabled BOOLEAN -- 实际存储为 INTEGER
);
0代表FALSE1代表TRUE
(2) DATE 和 DATETIME(日期和时间)
SQLite 没有 DATE 或 DATETIME 类型,但可以存储为 TEXT、INTEGER 或 REAL:
CREATE TABLE events (
id INTEGER PRIMARY KEY,
event_name TEXT,
event_date TEXT -- 可以存储 '2025-03-04'
);
SQLite 处理日期的方法:
TEXT(推荐):'YYYY-MM-DD HH:MM:SS'格式REAL:存储 自 1970-01-01 以来的天数INTEGER:存储 UNIX 时间戳(秒数)
插入日期
INSERT INTO events (event_name, event_date) VALUES ('Meeting', '2025-03-04 10:30:00');
INSERT INTO events (event_name, event_date) VALUES ('Conference', strftime('%Y-%m-%d %H:%M:%S', 'now'));
查询日期
SELECT * FROM events WHERE event_date > datetime('now', '-1 day');
4. SQLite 动态数据存储
SQLite 不强制列的数据类型,例如:
CREATE TABLE test (col1 INTEGER);
INSERT INTO test (col1) VALUES ('Hello'); -- 允许插入字符串
SELECT * FROM test;
SQLite 不会报错,但会根据存储类来存储数据:
col1设为INTEGER,但仍然可以存储字符串"Hello",会按TEXT处理。- 但如果
col1设为INTEGER PRIMARY KEY,则不能存储字符串。
5. SQLite 类型转换
SQLite 在存储和查询时可能会转换数据类型:
SELECT CAST('123' AS INTEGER); -- 返回 123
SELECT CAST(123 AS TEXT); -- 返回 '123'
SELECT CAST('3.14' AS REAL); -- 返回 3.14
6. SQLite 数据类型 vs 传统数据库
| 数据类型 | SQLite 存储类 | MySQL | PostgreSQL |
|---|---|---|---|
INTEGER | INTEGER | TINYINT、SMALLINT、MEDIUMINT、BIGINT | SMALLINT、BIGINT |
REAL | REAL | FLOAT、DOUBLE | FLOAT、DOUBLE PRECISION |
TEXT | TEXT | VARCHAR(n)、TEXT | VARCHAR(n)、TEXT |
BLOB | BLOB | BLOB | BYTEA |
BOOLEAN | NUMERIC(0/1) | TINYINT(1) | BOOLEAN |
DATE/DATETIME | TEXT/INTEGER/REAL | DATETIME | TIMESTAMP |
7. 什么时候使用 SQLite 的数据类型
- 存储整数 → 使用
INTEGER - 存储小数 → 使用
REAL - 存储文本 → 使用
TEXT - 存储二进制文件(图片、音频等) → 使用
BLOB - 存储日期/时间 → 使用
TEXT或INTEGER(UNIX 时间戳)
总结
- SQLite 只有 5 种存储类:
NULL、INTEGER、REAL、TEXT、BLOB。 - SQLite 不强制数据类型,但有类型亲和性。
BOOLEAN、DATE、DATETIME实际上会映射到NUMERIC或TEXT。- SQLite 支持动态数据存储,可以存储不同类型的数据,但建议遵循类型亲和性。
- 适当使用
CAST()进行数据类型转换。
更多详细内容请关注其他相关文章。