我有一个包含 156 列的表,其中大多数是 VARCHAR(1000) 或 TEXT。
现在,当将数据输入这样一行时,我得到
mysql_error() = 行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀被内联存储。
我正在考虑将表类型更改为 MyISAM。它在共享服务器上,但可以设置私有 MySQL 实例。
从这里:
InnoDB 实现事务、外键和关系约束,MyISAM 没有。
我仍然可以在 MyISAM 上使用 JOINS 等,对吧?我没有在这些表上实现任何其他复杂的东西。
5.5.14 和 5.6.3 和 5.7 有
innodb_file_format=Barracuda
一个选项。在 5.7.7 之前,请执行以下操作:
在 5.7.7 及之后的版本中,大部分都是您需要的默认设置。
DYNAMIC
是您需要的格式——它在行的主要部分只留下 22 个字节(限制为大约 8KB),并将其余部分放在溢出块中。这适用于VARCHAR
、TEXT
和。22*156 远低于 8K。“当行太长时,InnoDB 会选择最长的列进行页外存储。” 也就是说,给定行的一些较短的列可能仍驻留在“页面上”。VARBINARY
BLOB
我认为“22”是一个 2 字节长度,加上一个 20 字节“指针”指向数据。也就是说,没有任何数据存储在“页面上”,并且 768 是不相关的。
另一种可能性(但我不推荐)是将默认页面大小从 16KB 增加到 32KB,从而将最大值从大约 8K 增加到大约 16K。(有一个 64KB 的页面大小,但限制仍然是每行 16KB。)
另外,
COMPRESSED
可以用来代替DYNAMIC
,但同样,我不推荐它,尤其是在 5.7 之前。(“压缩 = 动态加压缩。”)拆分表(“垂直分区”)是个好主意。
MyISAM 是个坏主意。
检查你是否真的需要 1000 是个好主意。
我遇到了同样的问题,我通过使用文本数据类型而不是使用 varchar 解决了它,我知道这不是好的做法,也不是解决此问题的正确方法,但它会正常工作