选对数据库字段类型需匹配数据语义、精度、查询需求与扩展性:数值用int或decimal,时间选datetime或timestamp,文本按长度选varchar/text/json,关联用外键,枚举用enum或字典表。

选对数据库字段类型,核心是匹配数据语义、存储精度、查询需求和未来扩展性,不是越“大”越好,也不是越“新”越好。
看数据本质:数值类字段怎么定
整数用 INT(默认 4 字节)足够覆盖大多数 ID、计数、状态码;如果确定不会超 21 亿,别盲目上 BIGINT。需要带小数的场景分清楚:
– 金额、财务计算必须用 DECIMAL(M,D)(比如 DECIMAL(10,2)),避免浮点误差;
– 科学计算或容忍误差的测量值可用 FLOAT/DOUBLE;
– 枚举型小整数(如性别、状态)可考虑 TINYINT(1),但更推荐用 ENUM 或 SMALLINT + 注释说明,便于维护。
存时间:DATETIME 还是 TIMESTAMP?
DATETIME 存储范围广(1000–9999 年)、不自动时区转换,适合记录业务发生时间(如订单创建时间);
TIMESTAMP 范围窄(1970–2038),但自动转为 UTC 存储、读取时转回当前时区,适合记录系统行为时间(如最后登录时间),且节省 1 字节空间。
注意:MySQL 5.6.5+ 支持 DATETIME 的毫秒精度(DATETIME(3)),有高精度需求可直接启用,不必强切 TIMESTAMP。
文本字段:VARCHAR、TEXT 还是 JSON?
– 短文本(用户名、标题、邮箱)用 VARCHAR(N),N 按业务最大长度设(如邮箱 255),InnoDB 对 ≤768 字节的 VARCHAR 可全存主键索引页内,性能更稳;
– 长内容(文章正文、描述)用 TEXT,避免拖慢主表;
– 结构化但不定长的配置项(如用户偏好、API 响应缓存)优先用 JSON 类型(MySQL 5.7+),支持原生校验和路径查询,比存 serialized PHP 或纯 TEXT 更安全可控。
关联与枚举:别硬编码,用外键和约束
– 多对一关联(如用户所属城市)必须用 INT/BIGINT + 外键约束,别存城市名字符串;
– 固定选项集(如订单状态:pending、shipped、delivered)建议用 ENUM(MySQL 原生支持,节省空间、防止非法值),或用独立字典表 + 外键(更适合需多语言/频繁变更的场景);
– Boolean 逻辑字段统一用 TINYINT(1)(0/1),避免用字符串 'true'/'false',也别依赖 MySQL 的 BOOL 别名(本质仍是 TINYINT)。











