
MySQL8 中最常用的字段类型及其推荐长度,这是数据库表设计的基础,选对字段类型和长度能提升性能、节省存储空间。我会按使用场景分类,列出每种类型的用途、推荐长度和注意事项,方便你在表设计时直接参考。
一、字符串类型(最常用)
字符串类型是日常开发中使用最多的,核心区分定长(CHAR) 和变长(VARCHAR),以及大文本 / 二进制类型。
| 类型 | 长度范围 | 推荐长度 & 使用场景 | 关键说明 |
|---|---|---|---|
| CHAR(n) | n=0~255(字节) | n=1~32(如:性别CHAR(1)、状态CHAR(2)、验证码CHAR(6)) | 定长,查询速度快,适合长度固定的短字符串;不足长度会用空格填充,MySQL 8 会自动去除尾部空格 |
| VARCHAR(n) | n=0~65535(字节) |
- 用户名:VARCHAR(50)
|
变长,节省空间,适合长度不固定的字符串;n 表示字符数(utf8mb4 下,1 字符 = 4 字节) |
| TEXT | 最大 65535 字节(~64KB) | 短文本内容(如:商品描述、评论内容) | 不能设置长度,适合超过 VARCHAR 上限的文本,查询性能略低于 VARCHAR |
| MEDIUMTEXT | 最大 16MB | 长文本(如:文章内容、富文本编辑器内容) | 存储更大的文本,避免 TEXT 不够用的情况 |
| LONGTEXT | 最大 4GB | 超大文本(如:日志、备份数据) | 极少使用,优先考虑文件存储而非数据库 |
二、数值类型
数值类型需区分整数和小数,优先选择匹配数值范围的最小类型,减少存储空间。
1. 整数类型
| 类型 | 取值范围 | 推荐使用场景 | 关键说明 |
|---|---|---|---|
| TINYINT | -128~127(有符号)/ 0~255(无符号) | 状态值(如:是否删除TINYINT(1))、年龄TINYINT UNSIGNED(0~255 足够) | 占用 1 字节,最节省空间 |
| SMALLINT | -32768~32767 / 0~65535 | 小数值(如:地区编码、分类 ID) | 占用 2 字节 |
| INT | -21 亿~21 亿 / 0~42 亿 | 主键 ID(INT UNSIGNED AUTO_INCREMENT)、用户 ID、订单 ID | 占用 4 字节,最常用的整数类型 |
| BIGINT | -9e18~9e18 / 0~1.8e19 | 超大 ID(如:分布式 ID、海量数据主键) | 占用 8 字节,INT 不够用时使用 |
2. 小数类型
| 类型 | 精度范围 | 推荐使用场景 | 关键说明 |
|---|---|---|---|
| DECIMAL(M,D) | M = 总位数,D = 小数位数 | 金额(如:DECIMAL(10,2),支持 0~99999999.99)、百分比(DECIMAL(5,2)) | 精确小数,无精度丢失,适合金融 / 财务场景 |
| FLOAT | 单精度浮点,精度~7 位 | 非精确数值(如:身高、体重、评分) | 占用 4 字节,有精度丢失,不适合金额 |
| DOUBLE | 双精度浮点,精度~15 位 | 高精度非精确数值(如:科学计算、坐标) | 占用 8 字节,精度高于 FLOAT |
三、日期时间类型
MySQL 8 对日期时间类型支持更完善,优先选择语义匹配的类型。
| 类型 | 格式 | 取值范围 | 推荐使用场景 | 关键说明 |
|---|---|---|---|---|
| DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 生日、下单日期(仅需日期) | 占用 3 字节 |
| TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 时间段(如:活动时长、打卡时间) | 占用 3 字节 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 ~ 9999-12-31 | 创建时间、更新时间(DEFAULT CURRENT_TIMESTAMP) | 占用 8 字节,无时区问题,最常用 |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 ~ 2038-01-19 | 需时区同步的时间(如:跨时区系统) | 占用 4 字节,受时区影响,范围较小 |
| YEAR | YYYY | 1901 ~ 2155 | 仅需存储年份(如:出生年份、发布年份) | 占用 1 字节,极少使用,优先用 DATE |
四、特殊类型
| 类型 | 用途 | 推荐场景 | 关键说明 |
|---|---|---|---|
| ENUM | 枚举值 | 固定选项(如:性别ENUM('男','女','未知')、支付方式ENUM('微信','支付宝')) | 只能选枚举中的值,节省空间,查询效率高 |
| SET | 多选枚举 | 标签、权限(如:SET('阅读','写入','删除')) | 可多选,适合少量固定选项的多选场景 |
| BOOLEAN | 布尔值 | 等价于TINYINT(1),true=1,false=0 | 语法糖,实际存储为 TINYINT |
| JSON | JSON 格式数据 | 灵活的结构化数据(如:配置项、个性化设置) | MySQL 8 原生支持,可直接查询 JSON 内字段 |
五、字段类型选择最佳实践
优先匹配范围:比如年龄用TINYINT UNSIGNED而非INT,减少存储空间;
字符串长度合理:用户名VARCHAR(50)足够(避免设VARCHAR(255)浪费空间),邮箱VARCHAR(100)覆盖 99% 场景;
金额必用 DECIMAL:禁止用 FLOAT/DOUBLE,避免精度丢失;
时间优先 DATETIME:TIMESTAMP 范围有限,仅跨时区场景使用;
大文本不用数据库:超过 16MB 的文本 / 文件(如图片、视频),优先存储文件路径而非二进制数据。
总结
核心常用类型:VARCHAR(50/100/255)、INT UNSIGNED、DECIMAL(10,2)、DATETIME、TINYINT(1)是日常开发中 90% 场景会用到的类型;
长度原则:字符串类型按实际业务最大长度 + 少量冗余设置(如用户名最大 30 字符,设VARCHAR(50)),数值类型按取值范围选最小类型;
避坑点:INT(n)的 n 是显示宽度,不影响存储;VARCHAR的长度是字符数(utf8mb4 下需注意字节上限);金额必须用DECIMAL。
上一篇:浅谈mysql数据库编码utf8mb4_unicode_ci、utf8mb4_general_ci、utf8mb4_0900_ai_ci
下一篇:没有了
讨论数量:0