2012-04-27 19 views
7

我有一个MySQL数据库。我使用innodb。我的表格中有10个以上的列。最后一列有一个LONGTEXT类型,它应该包含html代码。问题是,对于每条记录,该字段不会认可完整的代码,并且始终在相同数量的字符后停止。我尝试插入的html文件的重量大约是60KO。所以我想我的每个记录都超过了mysql的行大小限制(66KO)。我想知道的是,如果有一些方法来扩展这个限制。任何解决方法将不胜感激。预先感谢投入。干杯。马克MYSQL - 如何解决66 KBy的行大小限制

回答

1

有没有方法来扩展此限制,因为它不依赖于存储引擎但它是一个hard limit on the server

每个表(无论存储引擎)具有 65,535字节的最大行大小。存储引擎可能会限制此限制,从而减少有效的最大行大小。

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

+5

此限制不适用于“BLOB”和“TEXT”类型。 http://dev.mysql.com/doc/refman/5.5/en/blob.html – eggyal 2012-04-27 11:07:23

+0

hello burhan。感谢workarounf想法(保存在文件系统中)。如果我找不到其他解决方案,我会这样做...... – Marc 2012-04-27 11:11:39

+0

你说得对,但我仍然支持我在数据库之外存储类似“文件”内容的建议。 – 2012-04-27 11:11:58

1

当你说“该字段不认可完整的代码,并总是在相同数量的字符后停止”,你如何确定该字段包含什么?我怀疑你正在查看的内容已被max_allowed_packet变量截断。

如在规定的MySQL manual

一个BLOBTEXT对象的最大尺寸是由它的类型来确定,但实际上可以在客户端和服务器之间传输的最大值是通过的量来确定可用内存和通信缓冲区的大小。您可以通过更改max_allowed_packet变量的值来更改消息缓冲区大小,但是您必须对服务器和客户端程序都这样做。例如,mysqlmysqldump使您能够更改客户端max_allowed_packet值。请参阅Section 8.11.2, “Tuning Server Parameters”,Section 4.5.1, “mysql — The MySQL Command-Line Tool”Section 4.5.4, “mysqldump — A Database Backup Program”。您可能还需要比较数据包大小和对象时,与存储要求存储的数据的大小,看Section 11.5, “Data Type Storage Requirements”

+0

你好eggyal。感谢您的意见。我会尝试一下,然后恢复... – Marc 2012-04-27 11:09:53

+0

@Marc:你有没有与'max_allowed_pa​​cket'运气? – eggyal 2012-05-01 19:37:31

6

(长)文本(和BLOB)的值为而不是存储在“行中”但在其外部。因此,HTML的大小不会影响单个行的大小。

从手册:

一个表的内部表示具有65535字节的最大行大小,即使存储引擎能够支持更大的行。该图排除BLOB或TEXT列,其朝向该尺寸

对于BLOB和TEXT数据仅贡献9至12个字节,信息被存储在内部存储器比所述行缓冲器的不同区域。

(重点煤矿)

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

15

接受的答案是错的(或至少相当自以为是) - 我不希望个人存储在我的数据库之外的数据,因为它创造了并发症在备份程序和事务查询方面。

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

此限制的原因是默认存储机制Antelope,存储该行中的第一768个字节的可变长度列的 - 以及可能的解决方案是使用INNODB和切换存储机构,以将替代Barracuda存储机构:

SET GLOBAL innodb_file_format=Barracuda; 

这将没有任何直接影响,因为此设置是新数据库文件的默认设置 - 所以您需要删除并重新创建整个数据库。

备选地,切换到梭子鱼(如上述),然后(除)切换到文件每次表的策略:

SET GLOBAL innodb_file_per_table=ON; 

同样,这将没有直接的影响,因为这两个设置的默认值对于新表格 - 再次,您需要删除并重新创建表格。

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

如果您不喜欢更改MySQL中的全局设置,请尝试使用SET SESSION而不是SET GLOBAL,例如,立即在运行您的CREATE TABLE报表。

+1

这应该是被接受的答案,值得注意的是,您可以“ALTER”已经创建的表来使用文件存储。 [docs](http://dev.mysql.com/doc/refman/5.5/en/innodb-compression-usage.html) – tonyjmnz 2014-03-18 13:57:28

+0

可能值得编辑你的答案,以包括默认配置设置为什么会起作用的原因他们是这样。从这里的MySQL文档(http://dev.mysql.com/doc/refman/5.5/en/innodb-row-format-antelope.html),原因是(至少现在)默认的INNODB文件格式是羚羊,它在行中存储了可变长度列的前768个字节。如果默认格式发生变化,则此解决方法可能不再需要。 – nextgentech 2015-05-25 20:49:59

0

我们按照以下步骤解决它。

第1步:在查询下面运行MySql来设置全局变量。

  • SET GLOBAL innodb_file_format = Barracuda;
  • SET GLOBAL innodb_file_per_table = ON;

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

步骤3:进入操作

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

第5步:单击Go。

:)