MySQL 不同字段类型占用字节长度以及显示长度

一、字段类型占用字节长度

1. 数值类型

类型字节长度显示长度(M)说明
TINYINT11~4显示长度无影响,仅用于填充
SMALLINT21~6显示长度无影响
MEDIUMINT31~9显示长度无影响
INT / INTEGER41~11显示长度无影响
BIGINT81~20显示长度无影响
FLOAT4-显示长度无影响
DOUBLE8-显示长度无影响
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. 日期和时间类型

类型字节长度显示长度说明
DATE310YYYY-MM-DD
DATETIME5/819YYYY-MM-DD HH:MM:SS(MySQL 5.6.4+ 为 8 字节)
TIMESTAMP4/719YYYY-MM-DD HH:MM:SS(MySQL 5.6.4+ 为 7 字节)
TIME38HH:MM:SS
YEAR14YYYY

4. 枚举和集合类型

类型字节长度显示长度说明
ENUM1/2-最多 2 字节,取决于枚举元素个数
SET1~8-取决于集合元素个数

5. 二进制类型

类型字节长度显示长度说明
BINARY(n)nn定长
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、常见误区

  • 误区1INT(5)只能存5位数字?**错!**它能存的范围和INT一样,只是显示时补零或限制宽度。
  • 误区2:显示长度影响存储空间?**错!**比如INT(5)INT(11)都占4字节。
  • 误区3VARCHAR(n)n是显示长度?**对!**但它同时限制最大存储字符数。

4、总结理解方法

  • 显示长度是“显示时的宽度”,不是“存储时的长度”。
  • 对整数类型,显示长度几乎没实际意义,除了ZEROFILL场景。
  • 对字符类型,显示长度和最大存储字符数一致。
  • 设计表结构时,关注实际存储长度,显示长度一般不用特别关心。

创作不易,点赞关注,持续更新~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值