MySQL最大行大小

4

我不知道为什么在 mysql 5.6.24 上出现了这种奇怪的行为,你能帮助我吗?你认为这是一个 bug 吗?

mysql -D database --default_character_set utf8 -e "ALTER TABLE abc_folder ADD COLUMN lev10 varchar(5000);"

错误 1118 (42000) 第一行: 行大小过大。使用的表类型的最大行大小(不包括BLOBs)为65535。这包括存储开销,请查阅手册。您需要将某些列更改为TEXT或BLOBs。

替代方案:

 mysql -D database --default_character_set utf8 -e "ALTER TABLE abc_folder ADD COLUMN lev10 varchar(50000);"

换句话说,更大的varchar()输入被接受并正确工作。有人知道发生了什么吗?

我假设在某个地方,varchar() 被转换成了某种 text 数据类型,但是我在文档中找不到相关的参考。 - Gordon Linoff
请提供 SHOW CREATE TABLE fnbl_folder。这可能有助于 @GordonLinoff 的评论,并且可以解释发生了什么。 - Rick James
1个回答

1
这个错误意味着在您的abc_folder表中,一行数据的大小超过了65535字节,但没有TEXT或BLOBS类型的列。65535是无符号16位二进制数可以表示的最大值。正如这里所述:

虽然InnoDB内部支持大于65,535字节的行大小,但MySQL本身对所有列的组合大小施加了65,535的行大小限制:

mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs

这意味着在内部,MySQL 可能使用一个 16 字节的数字来存储行的大小。
为了纠正您的错误,建议将 VARCHAR(5000)更改为 TEXT 或使用多个表。 如果要对列强制施加 5000 字节的限制,可以使用 TEXT,在插入表时应使用截断函数。您可以使用 substr
INSERT INTO abc_folder (lev10) VALUES (SUBSTR('Some Text',0, 5000))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接