MySQL对每个表有4096列的硬限制,但是对于给定的表,有效最大值可能会更少。确切的列限制取决于几个因素:
InnoDB
每个表的限制为1017列给定表的最大行大小由几个因素决定:
BLOB
和 TEXT
列仅有助于朝向行大小限制9〜12字节,因为它们的内容是从该行的其余部分分开存储。InnoDB
对于4KB,8KB,16KB和32KBinnodb_page_size
设置,表 的最大行大小(适用于本地存储在数据库页面内的数据)略小于页面的一半 。例如,对于默认的16KBInnoDB
页面大小,最大行大小略小于8KB 。对于64KB页面,最大行大小略小于16KBInnoDB
行超出最大行大小,请InnoDB
选择可变长度列进行外部页外存储,直到该行适合InnoDB
行大小限制。对于行外存储的变长列,本地存储的数据量因行格式而异。在下面的MyISAM例子中,改变柱TEXT 避免了65535字节的行大小限制,并且允许成功,因为操作 BLOB和 TEXT列仅有助于朝向行大小9至12个字节。
操作成功执行InnoDB 表,因为更改列以 TEXT避免MySQL 65,535字节行大小限制,并且InnoDB 可变长度列的页外存储避免了 InnoDB行大小限制。
可变长度列的存储包括长度字节,它们被计入行大小。例如, VARCHAR(255) CHARACTER SET utf8mb3列需要两个字节来存储值的长度,因此每个值最多可以占用767个字节。
t1 由于列需要32,765 + 2个字节和32,766 + 2个字节,因此 创建表的语句成功,最大行大小为65,535字节:
将列长度减少到65,533或更少可允许语句成功。
对于MyISAM表, NULL列需要行中的额外空间才能记录其值 NULL。每NULL 列需要一位额外的值,向上舍入到最接近的字节。
创建表的语句t3失败,因为除了可变长度列长度字节所需的空间之外,还MyISAM需要NULL列的空间,导致行大小超过65,535字节:
InnoDB将行大小(对于数据库页面中本地存储的数据)限制为略小于4KB,8KB,16KB和32KB innodb_page_size 设置的数据库页面的一半,对于64KB页面,将行大小限制 为略小于16KB。
t4由于定义的列超过16KB InnoDB页面的行大小限制,因此 创建表的语句失败。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有