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 适合长度固定的数据,提升性能。
posted @   lipu123  阅读(17)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示