8

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

4

5 回答 5

18

公认的答案是错误的(或至少相当固执) - 我个人不希望将数据存储在我的数据库之外,因为它会在备份过程和事务查询方面造成复杂性。

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

此限制的原因是默认存储机制Antelope,它存储行中可变长度列的前 768 个字节 - 一个可能的解决方案是使用 INNODB 并将您的存储机制切换到替代梭子鱼存储机制:

SET GLOBAL innodb_file_format=Barracuda;

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

或者,切换到 Barracuda(如上所述),然后(另外)切换到 file-per-table 策略:

SET GLOBAL innodb_file_per_table=ON;

同样,这不会立即生效,因为这两个设置都是新表的默认设置 - 所以同样,您需要删除并重新创建表。

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

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

于 2013-07-09T21:05:46.010 回答
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

于 2012-04-27T11:07:11.763 回答
2
于 2012-04-27T11:01:39.573 回答
0
于 2012-04-27T11:04:40.403 回答
0

我们通过以下步骤解决了它。

步骤 1:在 MySql 中运行以下查询以设置全局变量。

  • SET GLOBAL innodb_file_format=梭子鱼;
  • 设置全局 innodb_file_per_table=ON;

步骤2:选择当您尝试将大数据保存到单行时发生错误的表。

第 3 步:转到操作

第 4 步:从 ROW_FORMAT 中选择 COMPRESSED。(默认情况下,当您设置全局变量 innodb_file_format 和 innodb_file_per_table 时,COMPACT 和 REDUNDANT 将在那里,您可以找到其他选项,例如 COMPRESSED 和 DYNAMIC)

第 5 步:单击开始。

:)

于 2013-11-29T05:51:24.873 回答