10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 本手册摘录

MySQL 8.0参考手册// 桌柱数量和行大小的限制

8.4.7表列数和行大小的限制

本节介绍表中列表数量的限制以及单个行的大小。

列数限制

MySQL每个表具有4096列的硬限制,但给定表格的有效最大值可能较少。确切的列限制取决于几个因素:

行大小限制

给定表的最大行大小由以下几个因素决定:

  • 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行格式”

  • 不同的存储格式使用不同量的页眉和拖车数据,这会影响来自行的存储量。

行大小限制示例
  • MySQL的最大行大小限制为65,535字节,如下所示InnoDBMyISAM的例子。即使存储引擎能够支持更大的行,该限制也会在任何存储引擎中强制执行。

    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)字符集UTF8MB3Column使用两个字节来存储值的长度,因此每个值最多可以使用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前缀内联存储。