一、字段类型占用字节长度
1. 数值类型
| 类型 | 字节长度 | 显示长度(M) | 说明 |
|---|---|---|---|
| TINYINT | 1 | 1~4 | 显示长度无影响,仅用于填充 |
| SMALLINT | 2 | 1~6 | 显示长度无影响 |
| MEDIUMINT | 3 | 1~9 | 显示长度无影响 |
| INT / INTEGER | 4 | 1~11 | 显示长度无影响 |
| BIGINT | 8 | 1~20 | 显示长度无影响 |
| FLOAT | 4 | - | 显示长度无影响 |
| DOUBLE | 8 | - | 显示长度无影响 |
| DECIMAL(M,D) | 变长 | - | 约为 ceil(M/9)*4 字节 |
注意:数值类型的显示长度(如
INT(11))只影响ZEROFILL时的显示,不影响实际存储。
2. 字符串类型
| 类型 | 字节长度 | 显示长度 | 说明 |
|---|---|---|---|
| CHAR(n) | n × 字符字节数(定长) | n | 最多 255 |
| VARCHAR(n) | 实际字符字节数 + 1/2 字节长度前缀 | n | 最多 65535(受行长限制) |
| TINYTEXT | 实际字符字节数 + 1 字节长度前缀 | 255 | 最多 255 字节 |
| TEXT | 实际字符字节数 + 2 字节长度前缀 | 65535 | 最多 65535 字节 |
| MEDIUMTEXT | 实际字符字节数 + 3 字节长度前缀 | 16777215 | 最多 16777215 字节 |
| LONGTEXT | 实际字符字节数 + 4 字节长度前缀 | 4294967295 | 最多 4294967295 字节 |
注意:字符类型的存储长度与字符集相关,如 utf8 一个字符最多 3 字节,utf8mb4 最多 4 字节。
3. 日期和时间类型
| 类型 | 字节长度 | 显示长度 | 说明 |
|---|---|---|---|
| DATE | 3 | 10 | YYYY-MM-DD |
| DATETIME | 5/8 | 19 | YYYY-MM-DD HH:MM:SS(MySQL 5.6.4+ 为 8 字节) |
| TIMESTAMP | 4/7 | 19 | YYYY-MM-DD HH:MM:SS(MySQL 5.6.4+ 为 7 字节) |
| TIME | 3 | 8 | HH:MM:SS |
| YEAR | 1 | 4 | YYYY |
4. 枚举和集合类型
| 类型 | 字节长度 | 显示长度 | 说明 |
|---|---|---|---|
| ENUM | 1/2 | - | 最多 2 字节,取决于枚举元素个数 |
| SET | 1~8 | - | 取决于集合元素个数 |
5. 二进制类型
| 类型 | 字节长度 | 显示长度 | 说明 |
|---|---|---|---|
| BINARY(n) | n | n | 定长 |
| VARBINARY(n) | 实际长度+1/2字节前缀 | n | 变长 |
| BLOB | 实际长度+1/2/3/4字节前缀 | - | 按类型分 TINY/MEDIUM/LONG |
6. 其他补充说明
- InnoDB 行最大长度为 65535 字节,超出部分会存储到溢出页(如大 TEXT/BLOB)。
- 显示长度主要用于格式化输出,与存储无关。
- 字符串类型实际存储长度受字符集影响。
- DECIMAL 类型存储方式较特殊,具体可参考官方文档。
二、显示长度
1、什么是显示长度?
显示长度,是某些字段类型在定义时可以指定的一个数字。它不是数据实际存储的长度,而是对“显示”或“格式化输出”时的一种提示。
最常见于整数类型(如 INT、BIGINT)和定长字符类型(如 CHAR)。
2、显示长度的实际作用
2.1. 对整数类型
例如 INT(5),这里的5就是显示长度。它的作用是:
- 仅用于显示格式化输出,比如配合
ZEROFILL时,不足长度会在前面补零。 - 不影响实际存储,
INT类型无论你写INT(5)还是INT(11),占用的都是4字节。
例子:
CREATE TABLE t (
id INT(5) ZEROFILL
);
INSERT INTO t VALUES (42);
SELECT id FROM t; -- 结果是 00042
如果没有ZEROFILL,显示长度不会有任何影响。
MySQL 8.0后,整数类型的显示长度已被废弃,只有
ZEROFILL还会用到。
2.2. 对字符类型
对于CHAR(n),显示长度就是最大字符数(也是存储长度),比如CHAR(10)就是定长10字符。
但对于VARCHAR(n),显示长度就是最大字符数,实际存储长度随内容变化。
2.3. 对其它类型
如DECIMAL(M,D),M是总显示长度,D是小数点后长度。
3、常见误区
- 误区1:
INT(5)只能存5位数字?**错!**它能存的范围和INT一样,只是显示时补零或限制宽度。 - 误区2:显示长度影响存储空间?**错!**比如
INT(5)和INT(11)都占4字节。 - 误区3:
VARCHAR(n)的n是显示长度?**对!**但它同时限制最大存储字符数。
4、总结理解方法
- 显示长度是“显示时的宽度”,不是“存储时的长度”。
- 对整数类型,显示长度几乎没实际意义,除了
ZEROFILL场景。 - 对字符类型,显示长度和最大存储字符数一致。
- 设计表结构时,关注实际存储长度,显示长度一般不用特别关心。
创作不易,点赞关注,持续更新~~~
5697

被折叠的 条评论
为什么被折叠?



