日期:2026-07-11
难度:简单
标签:#面试 #MySQL #VARCHAR #数据类型 #VIP
一句话答案
两者按实际内容变长存储,但最大字符数分别是 100 和 10;声明长度还会影响长度前缀、行大小、索引长度、临时计算内存和数据约束,不能因为实际值短就认为完全相同。
面试口语版
VARCHAR 的 M 表示最大字符数,不是固定字节数。存同一个短字符串时,两者的数据主体占用接近,都是实际字节加 1 或 2 字节长度前缀;但最大可能字节数由字符集决定,例如 utf8mb4 最多每字符 4 字节。VARCHAR(100) 更容易使用 2 字节长度前缀,也会占用更多最大行长和索引预算,某些排序、临时表或客户端元数据会按声明最大长度估算资源。建表时应按业务真实上限定义,既提供约束,也避免不必要的资源和索引成本。
原理拆解
| 项目 | VARCHAR(10) | VARCHAR(100) |
|---|---|---|
| 最大字符数 | 10 | 100 |
| 实际数据存储 | 实际字节 + 长度前缀 | 实际字节 + 长度前缀 |
| utf8mb4 最大数据字节 | 40 | 400 |
| 约束能力 | 更严格 | 更宽松 |
| 索引/行大小预算 | 更小 | 更大 |
关键细节
- 长度前缀按最大可能字节数判断:不超过 255 字节通常为 1 字节,否则为 2 字节。
VARCHAR(10)可存 10 个字符,实际字节数随字符集和内容变化。- 盲目统一成
VARCHAR(255)会弱化数据约束,并可能放大临时计算与索引成本。
面试官追问
- utf8mb4 下 VARCHAR(100) 最多占多少数据字节?
- VARCHAR 的长度前缀为什么有 1 或 2 字节?
- 声明长度会影响查询性能吗?
高分补充
字段长度不仅是存储配置,也是领域约束,应与 API 校验、索引和下游协议保持一致。
学习清单
- 区分字符数、字节数、实际长度和声明上限。