VARCHAR和CHAR的区别以及mysql中utf8mb4中可以存储的最大字节数
1. 关于 VARCHAR(255) 的存储长度
问题焦点:为什么 VARCHAR(255) 的“最大字节数”是 255 * 4 = 1020,但实际存储 ASCII 字符时仅占用 2 字节?
解释:
字符集影响:utf8mb4 是变长编码,不同字符占用的字节数不同。例如:
- ASCII 字符(如英文、数字):1 字节/字符。
- 中文、常见 Unicode 字符:3 字节/字符。
- Emoji、特殊符号(如“墅”):4 字节/字符。
VARCHAR 的存储机制:
VARCHAR(255) 表示最多存储 255 个字符(非字节),实际字节数由字符决定。
最大理论字节数:255 * 4 = 1020 字节。
实际存储字节数:根据具体字符的字节占用累加。例如,存储 2 个 ASCII 字符时,实际占用 2 * 1 = 2 字节。
额外开销:VARCHAR 需要额外 1~2 字节存储“实际长度信息”(例如 255 字符需要 2 字节记录长度) 5 8。
总结:
VARCHAR(N) 的存储空间为 实际字符字节数 + 长度信息字节数,而非简单的 N * 4。
关于 CHAR(5) 的存储长度
问题焦点:为什么 CHAR(5) 的存储字节范围是 5~20,且需要存储长度信息?
解释:
CHAR 的存储机制:
CHAR 是定长存储类型,无论实际字符长度如何,始终占用固定字节空间。
对于 CHAR(5) utf8mb4,每个字符最多占用 4 字节,因此总空间为 5 * 4 = 20 字节。
如果存储 ASCII 字符(1 字节/字符),实际占用 5 * 1 = 5 字节,但剩余空间会填充空字符(类似空格),总占用仍为 20 字节。
长度信息存储:
CHAR 类型不需要存储长度信息,因为其长度固定。例如,CHAR(5) 始终按最大可能长度(20 字节)预分配空间。
用户可能混淆了 VARCHAR(需要存储长度信息)和 CHAR(无需存储长度信息)的机制。
总结:
CHAR(N) 的存储空间为 N * 最大字符字节数,实际数据不足时会填充空字符,但总长度固定
3. 关键对比:VARCHAR vs CHAR
特性 | VARCHAR | CHAR |
---|---|---|
存储方式 | 变长(实际数据 + 长度信息) | 定长(固定预分配空间) |
空间效率 | 更高效(按需占用) | 可能浪费(填充空字符) |
适用场景 | 长度变化大的字段(如评论) | 长度固定的字段(如国家码) |
长度信息存储 | 需要(1~2 字节) | 不需要 |
扩展:为什么需要区分 CHAR 和 VARCHAR?
- 性能:CHAR 的定长特性使得读取速度更快(无需解析长度信息)。
- 存储优化:VARCHAR 适合存储长度变化大的数据,节省空间;CHAR 适合长度固定的数据,提升性能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现