最近经常有加字段,varchar扩长度的需求,经常被问到,varchar最长多长?我们来综合聊一下MySQL的各种长度问题。
1.MySQL的列数限制
MySQL规范限制上最多支持4096列,但是通常没有表可以创建这么多列,实际上可以创建多少列基于以下几个因素:
a. 行的最大Size限制。
b. 存储引擎对每一列的类型和长度有不同的限制。
c. 存储引擎对最大列数的限制,例如innodb引擎规定最多支持1017列。
d. 索引里的Functional key 是用虚拟列来实现的,暂用一个列。
2.MySQL的行Size限制
MySQL行的实际长度,取决于以下几个因素:
a. MySQL的内部标准规定行最大size为65535 bytes。(BLOB类型和TEXT类型仅占用9-12bytes的指针位置,实际与行数据分开存储)
b. InnoDB存储引擎中规定本地存储数据的行size要略小于0.5* page size。如果列中包含可变长度列(varChar)超过了本地本地存储的限制,可变长度列会作为单独存储到off-page。本地存储&off-page总长度不能超过MySQL行限制(65535)。
c.存储引擎占用了部分空间存储格式信息。
综上: InnoDB存储引擎中,MySQL定长列的总size要小于0.5* page size,基于此最大列数也受到size的约束且小于1017列, 变长列 + 定长列的总Size要小于 65535,并不是通常见到的varchar size限制为65535。(还要注意对utf-8mb4编码varchar 需要额外花费2byte存储长度)
注意以上中的size为字节长度,通常定义的varchar(10)中的长度为字符长度,在utf8mb4编码中,一个字符占用3个字节。
点赞&关注&收藏,三连搞起来,欢迎留言提问。
参考文档:
MySQL :: MySQL 8.0 Reference Manual :: 8.4.7 Limits on Table Column Count and Row Size
MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types