在 mysql 里,int(11)、varchar(255) 这种写法几乎人人见过,
但真正理解它们“长度”含义的人并不多。
很多初学者会以为:
int(11):最多存 11 位数字varchar(255):最多存 255 个字节
👉 这两个理解,一个完全错误,一个只对了一半。
本文用大白话 + 实战视角,一次性把这两个“长度”讲清楚。
一、mysql 中的int:长度 ≠ 存储能力
int到底能存多大?
在 mysql 中,整数类型的取值范围,只和类型本身有关,和 (11) 没关系。
| 类型 | 字节 | 有符号范围 |
|---|---|---|
tinyint | 1 | -128 ~ 127 |
int | 4 | -2147483648 ~ 2147483647 |
bigint | 8 | 非常大 |
id int
👉 能不能存 2147483647,只由 int 决定。
那int(11)的11是什么意思?
一句话结论:
int(11)的 11 只是“显示宽度”,不影响存储范围。
也就是说:
int(3) int(11) int(100)
👉 存储能力完全一样。
int(11)什么时候才有意义?
只有在配合 zerofill 时,才有意义。
create table t ( a int(5) zerofill );
插入:
insert into t values (12);
查询结果:
00012
👉 仅仅是 显示时补 0
👉 实际存的还是数字 12
为什么现在不推荐写int(11)?
- 显示宽度是历史遗留概念
- 实际开发几乎不用
zerofill - mysql 8.0 已逐步弱化该概念
✅ 现代最佳实践:
int bigint tinyint
不要再写 (11)。
二、mysql 中的varchar:长度是真·限制
和 int 不同,varchar(n) 的 n 是有实际约束意义的。
varchar(n)的n表示什么?
一句话结论:
varchar(n)表示最多能存 n 个“字符”
⚠️ 注意:
- 是 字符
- 不是字节
- 不是显示宽度
字符 ≠ 字节(这是重点)
在 utf8mb4 字符集下:
| 内容 | 字符数 | 字节数 |
|---|---|---|
a | 1 | 1 |
中 | 1 | 3 |
😀 | 1 | 4 |
name varchar(4) character set utf8mb4
你可以存:
abcd(4 个字符)中秋节啊(4 个字符)😀😀😀😀(4 个字符)
👉 都合法
mysql 判断是否超长,看的是字符数。
varchar在底层是怎么存的?
varchar 是变长字符串,结构大致是:
[长度信息(字符数)] + [真实内容]
长度信息占用:
- 最大长度 ≤ 255 → 1 字节
- 最大长度 > 255 → 2 字节
varchar(200) -- 长度信息占用 1 字节 varchar(500) -- 长度信息占用 2 字节
varchar为什么不能随便写很大?
行长度限制
innodb 一行最大 ≈ 65535 字节
varchar(30000) character set utf8mb4
理论最大字节数:
30000 × 4 = 120000 ❌
👉 建表直接失败。
索引限制(非常常见)
name varchar(255) character set utf8mb4
如果你建索引:
create index idx_name on user(name);
索引长度可能超过限制,需要写:
create index idx_name on user(name(100));
三、charvsvarchar怎么选?
char(定长)
char(10)
- 永远占 10 个字符空间
- 适合长度固定的字段
典型场景:
- 手机号
- 状态码
- 国家码
varchar(变长)
varchar(255)
- 按实际长度存
- 更节省空间
- 大多数字符串字段首选
四、常见误区总结(面试高频)
误区 1:int(11)只能存 11 位数字
✅ 错,取值范围只和 int 有关
误区 2:varchar(255)是 255 字节
✅ 错,是 255 个字符
误区 3:varchar越大越安全
❌ 错,会影响索引、行长度和性能
五、工程级选型建议(直接照抄)
| 场景 | 推荐类型 |
|---|---|
| 主键 id | int unsigned / bigint |
| 状态 / 枚举 | tinyint |
| 用户名 | varchar(32) |
| 昵称 | varchar(64) |
| 邮箱 | varchar(128) |
| 备注 / 描述 | text |
六、一句话总结
int(n)的 n 只是显示宽度,不影响存储;varchar(n)的 n 是字符数量限制,是真正的约束。
到此这篇关于mysql中int的长度和varchar的长度的文章就介绍到这了,更多相关mysql中int长度和varchar长度内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论