选用能正确容纳你将要存储的每一个值的最小类型。合适的类型能节省磁盘、缩小索引,并防止数据被悄悄破坏。
数字
- 大多数 id 用
INT(4 字节);只有当你真的超出约 21 亿时才用BIGINT(8 字节)。 - 金额用
DECIMAL(10,2)— 用 /,它们以二进制舍入,会丢失小数分。
FLOATDOUBLEVARCHAR(n);n 是上限,存储只占用实际使用的部分。TEXT — 它存储在行外(off-page),且不能有默认值;不要用它来存放你要过滤的短值。DATETIME(无时区,8 字节) vs TIMESTAMP(转为 UTC,4 字节,约到 2038 年上限)。CREATE TABLE payments (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
amount DECIMAL(10,2) NOT NULL, -- 精确金额,不用 FLOAT
currency CHAR(3) NOT NULL, -- 始终 3 个字符 -> 定长 CHAR
note VARCHAR(255), -- 有上限,可建索引
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 陷阱:默认 SQL 模式会拒绝非法值(这是好事)--
INSERT INTO payments (amount) VALUES ('abc'); -- ERROR 1366,而不是悄悄存成 0
FLOAT 存金额。VARCHAR(255) — 过大的键会让索引膨胀。UNSIGNED(可使正数范围翻倍)。数据类型是你所做的成本最低的正确性与性能决策,却也是日后最难更改的一项 — 窄而精确的类型能让索引保持小巧,并在坏数据变成线上 bug 之前就把它挡在门外。