MySQL 的字段数据类型分为三大类:数值类型、字符串类型、日期类型。合理选择数据类型可以节省存储空间、提升查询效率。
一、数值类型
分为整数、浮点数、定点数。日常开发重点掌握 tinyint、int、bigint、decimal。
| 类型 | 占用空间 | 取值范围 | 使用说明 |
|---|---|---|---|
| tinyint | 1 byte | 有符号:-128 ~ 127 无符号:0 ~ 255 | 特小型整数,适合年龄、状态标记 |
| smallint | 2 byte | 有符号:-32768 ~ 32767 无符号:0 ~ 65535 | 小型整数,使用较少 |
| mediumint | 3 byte | 有符号:−231-2^{31}−231 ~ 231−12^{31}-1231−1 无符号:0 ~ 232−12^{32}-1232−1 | 中型整数,项目极少使用 |
| int / integer | 4 byte | 有符号:-2147483648 ~ 2147483647 | 最常用标准整数,普通主键、编号优先选择 |
| bigint | 8 byte | 超大范围整数 | 高并发业务主键、雪花id必备 |
| float | 4 byte | 单精度浮点数 | 存在精度丢失,禁止用于金额计算 |
| double | 8 byte | 双精度浮点数 | 依然存在精度丢失,禁止用于金额计算 |
| decimal | 可变长度 | 自定义精度 | 定点数,财务、金额强制使用 示例 decimal(10,2):一共10位数字,小数占2位 |
重点提醒:涉及货币金额,绝对不能使用 float / double,统一使用 decimal!
二、字符串类型
重点区分 char 和 varchar;blob系列、超长文本类型简单了解即可。
| 类型 | 最大长度 | 说明 |
|---|---|---|
| char(n) | 0~255 字符 | 定长字符串 存储不足n位时自动补空格;查询速度快。适合长度固定数据:手机号、身份证 |
| varchar(n) | 0~65535 字节 | 可变长度字符串(日常最常用) 占用空间随实际内容变化,节约存储。适合姓名、地址 |
| tinyblob / blob / mediumblob / longblob | - | 二进制字符串,用来存储文件二进制,开发不推荐数据库存文件 |
| tinytext / text / mediumtext / longtext | - | 长文本,适合文章、大量备注内容;尽量避免大量使用 |
核心区别总结
char:定长,查询快,浪费空间;
varchar:变长,节省空间,查询略慢;
短且固定长度的数据选用 char,长短不固定文本选用 varchar。
三、日期类型
| 类型 | 展示格式 | 说明 |
|---|---|---|
| date | 2026-08-01 |
只保存年月日 |
| time | 15:30:00 |
只保存时分秒,极少单独使用 |
| year | 2026 |
仅保存年份,使用场景有限 |
| datetime | 2026-08-01 15:30:00 |
主流时间类型,保存年月日时分秒,不受时区影响 |
| timestamp | 2026-08-01 15:30:00 |
时间戳,受时区影响,存在时间范围限制,新项目优先 datetime |
开发建议:不要使用字符串存储时间!时间范围筛选、时间函数运算无法高效执行。创建时间字段推荐:
datetime default current_timestamp
四、选型简单总结
- 整数:状态用 tinyint;普通id用 int;分布式id、超大序号使用 bigint
- 小数金额:必须 decimal,拒绝 float、double
- 字符串:固定长度选 char;长短不定选 varchar;超大段文本使用 text
- 时间:优先 datetime,不推荐 timestamp、不使用字符串存储日期
如果你需要,我可以把这份笔记和之前 DDL 的笔记合并成一份完整 SQL 文档。