mysql对表列数和⾏⼤⼩的限制
列计数限制
MySQL对于每个表具有4096个列的硬限制,但给定表的有效最⼤值可能较少。精确的列限制取决于⼏个因素:
1. 表的最⼤⾏⼤⼩限制列的数量(可能是⼤⼩),因为所有列的总长度不能超过此⼤⼩。请参阅
2. 单个列的存储要求限制了适合给定最⼤⾏⼤⼩的列数。某些数据类型的存储要求取决于存储引擎,存储格式和字符集等因素。请参见
3. 存储引擎可能会施加限制表列计数的额外限制。例如, InnoDB每个表的限制为1017列。请参见有关其他存储引擎的信息,请参见
4. 每个表都有⼀个.frm包含表定义的⽂件。该定义以可能影响表中允许的列数的⽅式影响此⽂件的内容。请参见
⾏⼤⼩限制
给定表格的最⼤⾏⼤⼩由以下⼏个因素决定:
1. MySQL表的内部表⽰形式的最⼤⾏⼤⼩限制为65,535字节,即使存储引擎能够⽀持较⼤的⾏。 BLOB并且 TEXT列只向⾏⼤⼩限制
贡献9到12个字节,因为它们的内容与⾏的其余部分分开存储。
2. InnoDB 适⽤于数据库页⾯本地存储的数据 的表的最⼤⾏⼤⼩略⼩于4KB,8KB,16KB和32KB innodb_page_size 设置的⼀半页
⾯ 。例如,对于默认的16KB InnoDB页⾯⼤⼩,最⼤⾏⼤⼩略⼩于8KB 。对于64KB页⾯,最⼤⾏⼤⼩略⼩于16KB。请参见
3. 如果包含可变长度列的InnoDB ⾏超过最⼤⾏⼤⼩,请InnoDB为外部页外存储选择可变长度列,直到该⾏适合InnoDB ⾏⼤⼩限制。
存储在页外的可变长度列的本地存储的数据量按⾏格式⽽不同。有关更多信息,请参见
4. 不同的存储格式使⽤不同数量的页眉和预告⽚数据,这会影响可⽤于⾏的存储量。
⾏⼤⼩限制⽰例
以下InnoDB 和MyISAM⽰例中演⽰了MySQL最⼤⾏⼤⼩限制为65,535字节。⽆论存储引擎如何,即使存储引擎可能能够⽀持较⼤的⾏,限制也被强制执⾏。
mysql> CREATE TABLE t (a VARCHAR(10000), b VARCHAR(10000),
c VARCHAR(10000),
varchar2最大长度d VARCHAR(10000),
e VARCHAR(10000),
f VARCHAR(10000),
g VARCHAR(6000)) ENGINE=InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
1
2
3
4
5
6
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): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
1
2
3
4
5
6
在下⾯的MyISAM例⼦中,改变柱TEXT 避免了65535字节的⾏⼤⼩限制,并且允许成功,因为操作 BLOB和 TEXT列仅有助于朝向⾏⼤⼩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;
Query OK, 0 rows affected (0.02 sec)
1
2
3
4
操作成功执⾏InnoDB 表,因为更改列以 TEXT避免MySQL 65,535字节⾏⼤⼩限制,并且InnoDB 可变长度列的页外存储避免了 InnoDB ⾏⼤⼩限制。
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=InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
1
2
3
4
可变长度列的存储包括长度字节,它们被计⼊⾏⼤⼩。例如, VARCHAR(255) CHARACTER SET utf8mb3列需要两个字节来存储值的长度,因此每个值最多可以占⽤767个字节。
t1 由于列需要32,765 + 2个字节和32,766 + 2个字节,因此 创建表的语句成功,最⼤⾏⼤⼩为65,535字节:
mysql> CREATE TABLE t1
(c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL)
ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.02 sec)
1
2
3
4
创建表的语句t2失败,因为尽管列长度在65,535字节的最⼤长度内,需要两个附加字节来记录长度,这导致⾏⼤⼩超过65,535字节:
(c1 VARCHAR(65535) NOT NULL)
ENGINE = InnoDB CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
1
2
3
4
5
6
将列长度减少到65,533或更少可允许语句成功。
mysql> CREATE TABLE t2
(c1 VARCHAR(65533) NOT NULL)
ENGINE = InnoDB CHARACTER SET latin1;
Query OK, 0 rows affected (0.01 sec)
1
2
3
4
对于表, NULL列需要⾏中的额外空间才能记录其值 NULL。每NULL 列需要⼀位额外的值,向上舍⼊到最接近的字节。
创建表的语句t3失败,因为除了可变长度列长度字节所需的空间之外,还MyISAM需要NULL列的空间,导致⾏⼤⼩超过65,535字节:
mysql> CREATE TABLE t3
(c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL)
ENGINE = MyISAM CHARACTER SET latin1;
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. This includes storage overhead,
check the manual. You have to change some columns to TEXT or BLOBs
1
2
3
4
5
6
有关列存储的信息,请参见
InnoDB将⾏⼤⼩(对于数据库页⾯中本地存储的数据)限制为略⼩于4KB,8KB,16KB和32KB innodb_page_size 设置的数据库页⾯的⼀半,对于64KB页⾯,将⾏⼤⼩限制 为略⼩于16KB。
t4由于定义的列超过16KB InnoDB页⾯的⾏⼤⼩限制,因此 创建表的语句失败。
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=COMPACT DEFAULT CHARSET latin1;
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using
ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论