MySQL - 行大小如何高于65535

时间:2016-01-11 21:14:45

标签: mysql database database-design limit rows

据我所知,mysql中的最大行限为65535,等于(2 ^ 16) - 1。我也明白这样的数据库设计很糟糕。但是,这是我的架构

CREATE TABLE mytable(
  a VARCHAR(20000),
  b VARCHAR(20000),
  c VARCHAR(20000),
  d VARCHAR(5535)
) CHARACTER SET=latin1;

这是我得到的输出

  

行大小太大。所使用的表类型的最大行大小(不包括BLOB)是 65535 。这包括存储开销,请查看手册。您必须将某些列更改为TEXT或BLOB

让我们再次进行数学计算

20000 + 20000 + 20000 + 5535 = 65535

等于且不超过限制。对于记录,有效的列d的最高值是5526

我不明白这些额外的9个字符来自哪里。

2 个答案:

答案 0 :(得分:2)

来自:http://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html

         row length = 1
         + (sum of column lengths)
         + (number of NULL columns + delete_flag + 7)/8
         + (number of variable-length columns)

尝试将列类型更改为VARCHAR(20000)NOT NULL

答案 1 :(得分:1)

VARCHAR的大小计算如下:

len + 1个字节,如果列为0 - 255个字节,len + 2个字节,如果列可能需要超过255个字节

所以

CREATE TABLE mytable(
  a VARCHAR(20000),       -- 20002
  b VARCHAR(20000),       -- 20002
  c VARCHAR(20000),       -- 20002
  d VARCHAR(5535)         --  5537
) CHARACTER SET=latin1;--    65543 !!!! 8 Bytes to much

请参阅此https://mariadb.com/kb/en/mariadb/data-type-storage-requirements/