据我所知,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个字符来自哪里。
答案 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/