本节描述对表中列数和单个行大小的限制。
MySQL对每个表有4096列的硬性限制,但对于给定的表,有效的最大值可能更小。准确的列限制取决于以下几个因素:
表的最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过这个大小。看到行大小限制.
单个列的存储需求限制了满足给定的最大行大小的列的数量。某些数据类型的存储需求取决于存储引擎、存储格式和字符集等因素。看到第11.7节“数据类型存储要求”.
存储引擎可能会施加限制表列计数的附加限制。例如,
InnoDB
每个表限制为1017列。看到第15.22节,“InnoDB限制”.有关其他存储引擎的信息,请参见第十六章,替代存储引擎.功能关键部分(见第13.1.15节“CREATE INDEX语句”)被实现为隐藏的虚拟生成存储列,因此表索引中的每个功能键部分都计入表的总列限制。
给定表的最大行大小由以下几个因素决定:
即使存储引擎能够支持更大的行,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表t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g VARCHAR(6000))错误1118(42000):行大小太大。所用表类型的最大行大小(不包括blob)是65535。这包括存储开销,请查看手册。您必须将一些列更改为TEXT或blob
mysql> CREATE表t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g VARCHAR(6000))错误1118(42000):行大小太大。所用表类型的最大行大小(不包括blob)是65535。这包括存储开销,请查看手册。您必须将一些列更改为TEXT或blob
在接下来的
MyISAM
例如,将一列更改为文本
避免65,535字节的行大小限制并允许操作成功,因为团
而且文本
列只占行大小的9到12个字节。mysql> CREATE表t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g TEXT(6000))查询OK, 0行受影响(0.02秒)
操作成功
InnoDB
表,因为将列更改为文本
避免MySQL的65,535字节行大小限制,和InnoDB
变长列的离页存储避免了InnoDB
行大小限制。mysql> CREATE t (a VARCHAR(10000), b VARCHAR(10000), c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), f VARCHAR(10000), g TEXT(6000)) =InnoDB字符集latin1;查询OK, 0行受影响(0.02秒)
变长列的存储包括长度字节,它被计入行大小。例如,一个
VARCHAR(255)字符集utf8mb3
列占用两个字节来存储值的长度,因此每个值最多可以占用767个字节。创建表的语句
t1
成功是因为列需要32,765 + 2字节和32,766 + 2字节,这属于最大行大小65,535字节:CREATE TABLE t1 (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL) = InnoDB CHARACTER SET latin1;查询OK, 0行受影响(0.02秒)
创建表的语句
t2
失败的原因是,尽管列长度在最大长度65,535字节内,但需要另外两个字节来记录长度,这导致行大小超过65,535字节:mysql> CREATE TABLE t2 (c1 VARCHAR(65535) NOT NULL)错误1118(42000):行大小太大。所用表类型的最大行大小(不包括blob)是65535。这包括存储开销,请查看手册。您必须将一些列更改为TEXT或blob
将列长度减少到65,533或更短允许语句成功。
mysql> CREATE TABLE t2 (c1 VARCHAR(65533) NOT NULL)查询OK, 0行受影响(0.01秒)
为
MyISAM
表,零
列需要行中额外的空间来记录它们的值是否为零
.每一个零
列多取一位,四舍五入到最近的字节。创建表的语句
t3
失败,因为MyISAM
需要的空间零
列加上可变长度列长度字节所需的空间,导致行大小超过65,535字节:mysql> CREATE TABLE 3 (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)错误1118(42000):行大小太大。所用表类型的最大行大小(不包括blob)是65535。这包括存储开销,请查看手册。您必须将一些列更改为TEXT或blob
和有关信息。
InnoDB
零
列存储,看到第15.10节,“InnoDB行格式”.InnoDB
将行大小(对于本地存储在数据库页面中的数据)限制为略小于数据库页面的一半,分别为4KB、8KB、16KB和32KBinnodb_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),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),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 CHAR latin1;错误1118(42000):行大小太大(> 8126)。将一些列更改为TEXT或BLOB可能会有所帮助。在当前行格式中,0字节的BLOB前缀内联存储。