本节介绍表中列表数量的限制以及单个行的大小。
给定表的最大行大小由几个因素确定:
即使存储引擎能够支持较大的行,MySQL表的内部表示也具有65,535个字节的最大行大小限制。
斑点
和文本
列仅向行大小限制贡献9到12个字节,因为它们的内容与行的其余部分分开存储。最大行大小为
Innodb.
适用于数据库页面本地存储的数据的表略小于4KB,8KB,16KB和32KB的一页innodb_page_size.
设置。例如,默认16KB的最大行大小略小于8KBInnodb.
页面大小。对于64KB页面,最大行大小略小于16KB。看innodb限制。如果包含一行可变长度列超过这一点
Innodb.
最大行大小,Innodb.
为外部非页面存储选择可变长度列,直到行适合其中Innodb.
行大小限制。用于存储关闭页面的可变长度列本地存储的数据量因行格式而异。有关更多信息,请参阅innodb行格式。不同的存储格式使用不同量的页眉和拖车数据,这会影响来自行的存储量。
有关的信息
Innodb.
行格式,看innodb行格式。有关的信息
myisam.
存储格式,查看Myisam表存储格式。
行大小限制示例
以下展示了65,535个字节的MySQL最大行大小限制
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字符集拉丁仪;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
MySQL> Create Table T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G VARCHAR(6000))发动机=myisam字符集拉丁in;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
在下面的
myisam.
示例,将列更改为文本
避免了65,535字节的行大小限制并允许操作成功,因为斑点
和文本
列仅向行大小贡献9到12个字节。MySQL>创建表T(VARCHAR(10000),B VARCHAR(10000),C VARCHAR(10000),D VARCHAR(10000),E VARCHAR(10000),F VARCHAR(10000),G Text(6000))引擎=myisam字符集拉丁in;查询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
列需要两个字节来存储值的长度,因此每个值最多可以高达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;错误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;错误1118(42000):行尺寸太大。使用表类型的最大行大小,而不是计数Blob,为65535.这包括存储开销,请检查手册。您必须将某些列更改为文本或blobs
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焦炭(255),C10焦炭(255),C11焦炭(255),C12字符(255),C13焦炭(255),C14焦炭(255),C15炭(255),C16炭(255),C17焦炭(255),C18焦炭(255),C19焦炭(255),C20焦炭(255),C21焦炭(255),C22炭(255),C23焦炭(255),C24焦炭(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炭(255))Engine = InnoDB Row_Format =动态默认字符集LATIN1;错误1118(42000):行尺寸太大(> 8126)。将某些列更改为文本或BLOB可能有所帮助。以当前的行格式,0字节的Blob前缀内联。