本节介绍表中列表数量的限制以及单个行的大小。
MySQL每个表具有4096列的硬限制,但给定表格的有效最大值可能较少。确切的列限制取决于几个因素:
表的最大行大小约束列的数字(且可能大小),因为所有列的总长度不能超过此大小。看到行大小限制。
单个列的存储需求限制了符合给定的最大行大小的列数。某些数据类型的存储要求取决于存储引擎、存储格式和字符集等因素。看到第11.7节,“数据类型存储要求”。
存储引擎可能会施加额外的限制来限制表列计数。例如,
InnoDB
每个表限制为1017列。看到第15.22节,“InnoDB限制”。有关其他存储引擎的信息,请参阅第16章,替代存储引擎。功能关键部分(参见第13.1.15节“创建索引声明”)被实现为隐藏的虚拟生成的存储列,因此表索引中的每个功能性关键部分将计入表的总列限制。
给定表的最大行大小由以下几个因素决定:
MySQL表的内部表示的最大行大小限制是65,535字节,即使存储引擎能够支持更大的行。
斑点
和文本
列只对行大小限制贡献9到12个字节,因为它们的内容与行其余部分是分开存储的。对象的最大行大小
InnoDB
对于4KB、8KB、16KB和32KB的数据,应用于本地存储在数据库页中的数据的表略少于半页innodb_page_size
设置。例如,默认16KB的最大行大小略小于8KBInnoDB
页面大小。对于64KB页,最大行大小略小于16KB。看到第15.22节,“InnoDB限制”。如果一行包含可变长度列超过了
InnoDB
最大的行大小,InnoDB
为外部页外存储选择变长列,直到行适合于InnoDB
行大小限制。用于存储关闭页面的可变长度列本地存储的数据量因行格式而异。有关更多信息,请参阅章节15.10,“InnoDB行格式”。不同的存储格式使用不同量的页眉和拖车数据,这会影响来自行的存储量。
有关的信息
InnoDB
行格式,请参阅章节15.10,“InnoDB行格式”。有关的信息
MyISAM
存储格式,见第16.2.3节“Myisam表存储格式”。
行大小限制示例
MySQL的最大行大小限制为65,535字节,如下所示
InnoDB
和MyISAM
的例子。即使存储引擎能够支持更大的行,该限制也会在任何存储引擎中强制执行。MySQL> Create Table T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G VARCHAR(6000))发动机=innodb字符集拉丁仪;ERROR 1118(42000):行大小太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g VARCHAR(6000)) ENGINE=MyISAM CHARACTER SET latin1;ERROR 1118(42000):行大小太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
在下面的
MyISAM
例如,将列更改为文本
避免了65,535字节的行大小限制,并允许操作成功,因为斑点
和文本
列仅向行大小贡献9到12个字节。mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g TEXT(6000)) ENGINE=MyISAM CHARACTER SET latin1;查询OK,影响0行(0.02秒)
操作成功
InnoDB
表,因为更改列到文本
避免MySQL 65,535字节行大小限制,以及InnoDB
变长列的页外存储避免了InnoDB
行大小限制。MySQL>创建表T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G Text(6000))引擎=innodb字符集拉丁仪;查询OK,影响0行(0.02秒)
可变长度列的存储包括长度字节,将计入行大小。例如,一个
varchar(255)字符集UTF8MB3
Column使用两个字节来存储值的长度,因此每个值最多可以使用767字节。创建表的语句
t1
成功是因为列需要32,765 + 2字节和32,766 + 2字节,这属于最大行大小65,535字节:MySQL>创建表T1(C1 VARCHAR(32765)不是空,C2 VARCHAR(32766)不是空)引擎= InnoDB字符集拉丁文1;查询OK,影响0行(0.02秒)
创建表的语句
t2
失败的原因是,尽管列长度在最大长度65,535字节内,但需要两个额外的字节来记录长度,这导致行大小超过65,535字节:MySQL> Create Table T2(C1 Varchar(65535)不是NULL)Engine = InnoDB字符集Latin1;ERROR 1118(42000):行大小太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
将列长度减少到65,533或更少允许语句成功。
MySQL> Create Table T2(C1 Varchar(65533)不是空值)Engine = InnoDB字符集Latin1;查询OK,影响0行(0.01秒)
为
MyISAM
桌子,零
列需要行中额外的空间来记录其值是否为零
。每一个零
列多取一位,四舍五入到最近的字节。创建表的语句
t3
失败,因为MyISAM
需要的空间零
除了可变长度列长度字节所需的空间之外的列,导致行大小超过65,535字节:MySQL>创建表T3(C1 VARCHAR(32765)NULL,C2 VARCHAR(32766)NULL)引擎= MYISAM字符集LATIN1;ERROR 1118(42000):行大小太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
有关的信息
InnoDB
零
列存储,见章节15.10,“InnoDB行格式”。InnoDB
对于4KB、8KB、16KB和32KB,将行大小(对于本地存储在数据库页中的数据)限制为略低于半个数据库页innodb_page_size
对于64KB的页面,设置为略小于16KB。创建表的语句
t4
失败,因为所定义的列超过了16KB的行大小限制InnoDB
页。mysql> CREATE TABLE t4 (c1 CHAR(255),c2 CHAR(255),c3 CHAR(255), c4 CHAR(255),c5 CHAR(255),c6 CHAR(255), c7 CHAR(255),c8 CHAR(255),c9 CHAR(255), c10 CHAR(255),c11 CHAR(255),c12 CHAR(255), c13 CHAR(255),c14 CHAR(255),c15 CHAR(255), c16 CHAR(255),c17 CHAR(255),c18 CHAR(255), c19 CHAR(255),c20 CHAR(255),c21 CHAR(255)c22 CHAR(255),c23 CHAR(255),c24 CHAR(255), c25 CHAR(255),c26 CHAR(255),c27 CHAR(255), c28 CHAR(255),c29 CHAR(255),c30 CHAR(255), c31 CHAR(255),c32 CHAR(255),c33 CHAR(255)) ENGINE=InnoDB ROW_FORMAT=DYNAMIC DEFAULT CHARSET latin1;ERROR 1118(42000):行大小太大(> 8126)。将一些列更改为TEXT或BLOB可能会有所帮助。在当前行格式中,0字节的BLOB前缀内联存储。