3. 建库建表与数据类型
这是什么:SQLite 的建表语法和 MySQL 几乎一样,但类型系统不同——它只有 5 种存储类型(NULL / INTEGER / REAL / TEXT / BLOB),并靠「类型亲和」(type affinity)决定你的数据实际怎么存。
为什么用:从 MySQL 过来的人最容易在这里犯迷糊——明明建了 VARCHAR(50),怎么存进去变 TEXT 了?搞懂亲和,差异就通了。
如何用:还是建 user 和 article 两张表,重点看 SQLite 写法与 MySQL 写法的对照。
3.1 五种存储类型
| 类型 | 存什么 | 类比 |
|---|---|---|
| NULL | 空值 | 没填 |
| INTEGER | 整数 | 数量、id |
| REAL | 浮点数 | 均分、金额(粗略) |
| TEXT | 文本 | 用户名、标题 |
| BLOB | 二进制 | 图片、文件 |
没有 DATE 类型——时间用 TEXT("2026-10-25")或 INTEGER(时间戳)存,这是新手第二个惊讶点。
3.2 类型亲和:列的类型只是「建议」
建表时写的类型,SQLite 会把它归并到 5 种亲和之一(如 VARCHAR → TEXT 亲和、INT → INTEGER 亲和),插入的数据再按亲和转换:
CREATE TABLE demo (a TEXT, b);
INSERT INTO demo VALUES (123, 'x');
SELECT a, typeof(a) FROM demo;
预期输出(数字 123 存进 TEXT 列,被转成了文本):
123|text
MySQL 对超长或类型不符会报错或截断,SQLite 则尽量「帮你转」——约束更松,更要自己把关。
3.3 建两张博客表
CREATE TABLE user (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
email TEXT
);
CREATE TABLE article (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
views INTEGER DEFAULT 0,
user_id INTEGER NOT NULL REFERENCES user(id)
);
建好后用 .schema user 看一眼实际结构:
sqlite> .schema user
CREATE TABLE user (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
email TEXT
);
3.4 与 MySQL 的写法对照
| 你想表达 | MySQL 写法 | SQLite 写法 |
|---|---|---|
| 自增主键 | INT AUTO_INCREMENT PRIMARY KEY |
INTEGER PRIMARY KEY(自动自增) |
| 短文本 | VARCHAR(50) |
TEXT(长度可写,但被忽略) |
| 时间 | DATETIME |
TEXT 存 "2026-10-25 12:00:00" |
| 布尔 | BOOLEAN |
INTEGER 存 0 / 1 |
最值得注意的是第一条:INTEGER PRIMARY KEY 就是自增主键,这是 SQLite 的固定搭配(本质是行号的别名 ROWID),不用再写 AUTO_INCREMENT。
3.5 动手改
- 建一张
comment表:id、text(NOT NULL)、user_id、article_id,全部外键指向对应表 - 往
user.email插入数字123,再用typeof()查它变成了什么 - 建一张
age INTEGER列的表,插入'abc'会成功吗?(会——转换失败就按原样存,想想这算不算隐患)
3.6 小结
- SQLite 只有 NULL / INTEGER / REAL / TEXT / BLOB 五种存储类型
- 列类型是「亲和建议」,数据按亲和尽量转换
INTEGER PRIMARY KEY= 自增主键;时间用 TEXT 或时间戳存