You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中VARCHAR与TEXT的存储方式是否存在差异?

MySQL中VARCHAR和TEXT的存储差异澄清

核心结论

两种官方文档的描述都准确,二者看似矛盾的原因是适用的规则层面不同:

  • 从InnoDB引擎层的实际存储逻辑来看:VARCHAR和TEXT同属可变长度列,存储规则完全一致
  • 从MySQL服务层的全局行大小限制规则来看:二者的大小计算逻辑存在明确差异

1. InnoDB引擎层的存储规则(二者完全一致)

InnoDB的所有可变长度类型(包括VARCHAR、TEXT、BLOB等)的存储逻辑完全由行格式决定,两类字段没有区别:

  • 若使用COMPACT/REDUNDANT行格式:字段内容长度≤768字节时全部存储在行内,超出部分存到溢出页,行内仅保留768字节前缀+20字节的溢出页指针
  • 若使用DYNAMIC/COMPRESSED行格式(MySQL 8.0默认行格式):字段内容长度≤页大小的1/2(默认16KB页的话就是8192字节)时全部存储在行内,超出部分全量存到溢出页,行内仅保留20字节的溢出页指针
    这就是官方文档将二者同归为可变长度列的原因。

2. MySQL服务层的行大小限制规则(二者计算逻辑不同)

MySQL服务层存在独立于存储引擎的全局限制:单行数据的最大长度为65535字节,这个限制的计算规则对两类字段有差异:

  • 对于VARCHAR字段:会按字段定义的最大可能占用字节数计入限制,比如VARCHAR(1000)使用utf8mb4字符集时,会按1000*4=4000字节计入65535的限制,所以你无法直接创建一个VARCHAR(65535)的字段,因为仅这一个字段就会超出服务层行大小限制
  • 对于TEXT/BLOB字段:仅将9~12字节的指针开销计入65535的限制,实际存储的内容长度不占用这个额度,这就是文档中“仅贡献9到12字节”表述的来源。

3. 常见误区澄清

很多人误以为TEXT一定是全量溢出存储、VARCHAR一定是行内存储,这个认知是错误的:只要字段内容长度超过对应行格式的行内存储阈值,不管是VARCHAR还是TEXT,都会走溢出存储,二者逻辑没有区别。


内容的提问来源于stack exchange,提问作者Sihao Xie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:36:03