MYSQL - 如何解决66 KB的行大小限制

Mar*_*arc 8 mysql

我有一个mysql数据库.我用innodb.我的表中有0个包含多于10列.最后一列的类型为LONGTEXT,它应该包含html代码.问题是,对于每个记录,该字段不包含完整代码,并且它始终在相同数量的字符之后停止.我尝试插入的html文件的重量约为60KO.所以我猜我的每条记录都超过了mysql的行大小限制(66KO).我想知道的是,是否有一些方法可以解除这个限制.任何解决方法都将非常感激.提前感谢您的投入.干杯.渣

min*_*.dk 17

接受的答案是错误的(或者至少是相当自以为是) - 我个人并不希望将数据存储在我的数据库之外,因为它会在备份过程和事务查询方面产生复杂性.

正如其他人指出的那样,手册反复声明BLOB和TEXT列不计入总行大小,但不幸的是,使用默认配置设置,这不是真的,并且最终得到此错误消息.(错误消息没有任何意义,因为它告诉您使用TEXT而不是VARCHAR来解决问题 - 您已经这样做了.)

这种限制的原因是默认存储机制Antelope,它存储行中可变长度列的前768个字节 - 可能的解决方案是使用INNODB并将存储机制切换到备用Barracuda存储机制:

SET GLOBAL innodb_file_format=Barracuda;
Run Code Online (Sandbox Code Playgroud)

这不会立即生效,因为此设置是新数据库文件的默认设置 - 因此您需要删除并重新创建整个数据库.

或者,切换到Barracuda(如上所述),然后(另外)切换到每表文件策略:

SET GLOBAL innodb_file_per_table=ON;
Run Code Online (Sandbox Code Playgroud)

同样,这不会立即产生影响,因为这两个设置都是新表的默认设置 - 因此,您需要删除并重新创建表.

如果在执行此操作后查看MySQL数据文件夹,则可以确认已创建单独的文件,例如,对于名为"data"的数据库和名为"test"的表,您应该看到名为"data/test/bigtable"的文件的.ibd".

如果您不喜欢更改MySQL中的全局设置,请尝试SET SESSION代替SET GLOBAL,例如在运行CREATE TABLE语句之前立即执行.


a_h*_*ame 7

(LONG)TEXT(和BLOB)的值存储在"行"中,而是存储在其外部.因此,HTML的大小不会影响各行的大小.

从手册:

即使存储引擎能够支持更大的行,表的内部表示的最大行大小为65,535字节.该图不包括BLOB或TEXT列,它们只向该大小贡献9到12个字节

对于BLOB和TEXT数据,信息内部存储在与行缓冲区不同的内存区域中.

(强调我的)

http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html


Bur*_*lid 0

无法扩展此限制,因为它不依赖于存储引擎,但它是服务器上的硬限制

每个表(无论存储引擎如何)的最大行大小为 65,535 字节。存储引擎可能会对此限制施加额外的约束,从而减少有效的最大行大小。

在这种情况下,解决方案应该围绕将 HTML 存储推迟到其他位置 - 文件系统或云 (S3) 上,然后引用表列中的文件名。

  • 此限制不适用于“BLOB”和“TEXT”类型。http://dev.mysql.com/doc/refman/5.5/en/blob.html (8认同)