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字节,如下所示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前缀内联存储。