我有一个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语句之前立即执行.
(LONG)TEXT(和BLOB)的值不存储在"行"中,而是存储在其外部.因此,HTML的大小不会影响各行的大小.
从手册:
即使存储引擎能够支持更大的行,表的内部表示的最大行大小为65,535字节.该图不包括BLOB或TEXT列,它们只向该大小贡献9到12个字节
对于BLOB和TEXT数据,信息内部存储在与行缓冲区不同的内存区域中.
(强调我的)
http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html
| 归档时间: |
|
| 查看次数: |
9735 次 |
| 最近记录: |