MYSQL - 如何解决66 KBytes的行大小限制问题

9 浏览
0 Comments

MYSQL - 如何解决66 KBytes的行大小限制问题

我有一个MySQL数据库,使用InnoDB引擎。其中一个表格包含了多于10个字段。最后一个字段的数据类型是LONGTEXT,应该包含HTML代码。问题是,每条记录中该字段都没有包含完整的代码,总是在相同数量的字符后停止。我尝试插入的HTML文件大约有60KB,所以我猜每条记录都超过了MySQL的行大小限制(66KB)。我想知道是否有办法扩展这个限制。对于任何解决方法,我都非常感激。提前感谢您的帮助。谢谢。马克

0
0 Comments

MYSQL中的行大小有一个限制,最大为65,535字节。但是,(LONG)TEXT(和BLOB)的值并不是存储在行内,而是存储在行外。因此,您的HTML的大小不会影响单个行的大小。

根据手册的说明:

“表的内部表示具有最大行大小为65,535字节的限制,即使存储引擎能够支持更大的行。这个数字不包括只对此大小贡献9到12字节的BLOB或TEXT列。”

“对于BLOB和TEXT数据,信息在内存的不同区域内存储,而不是行缓冲区内。”

原文链接:http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html

因此,如果遇到超过65,535字节的行大小限制问题,我们可以使用以下解决方法之一:

1. 将超长的文本或二进制数据存储为文件,然后在数据库中存储文件的路径。这样可以避免将其存储在行中,从而绕过行大小限制。

示例代码:

CREATE TABLE my_table (
   id INT PRIMARY KEY,
   file_path VARCHAR(255)
);

2. 将超长的文本或二进制数据拆分为多个较小的部分,并使用多个行来存储它们。然后,使用一些额外的列或关联表来标识它们属于同一个文本或二进制数据。

示例代码:

CREATE TABLE my_table (
   id INT PRIMARY KEY,
   part_1 TEXT,
   part_2 TEXT,
   part_3 TEXT,
   ...
);

3. 使用压缩算法对超长的文本或二进制数据进行压缩,然后将压缩后的数据存储在数据库中。这样可以减小数据的大小,从而绕过行大小限制。

示例代码:

CREATE TABLE my_table (
   id INT PRIMARY KEY,
   compressed_data BLOB
);

通过采用上述解决方法,我们可以绕过MYSQL行大小限制,存储超过65,535字节的文本或二进制数据。

0
0 Comments

在这段对话中,问题是关于MySQL中的行大小限制的。用户报告说某个字段不包含完整代码,并且在相同数量的字符后停止。对于这个问题的出现原因,有人怀疑是由于max_allowed_packet变量导致的截断。

根据MySQL手册的说明,BLOBTEXT对象的最大大小由其类型确定,但是实际上可以在客户端和服务器之间传输的最大值取决于可用内存和通信缓冲区的大小。可以通过更改max_allowed_packet变量的值来修改消息缓冲区的大小,但必须同时对服务器和客户端程序进行更改。例如,mysqlmysqldump都可以更改客户端的max_allowed_packet值。可以参考相关文档了解更多信息。

最后,用户被询问是否尝试过修改max_allowed_packet变量解决问题。

解决方法:尝试修改max_allowed_packet变量的值。

0
0 Comments

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

在这个问题中,问题出现的原因是默认配置设置下,BLOB和TEXT列被计入了总行大小,而官方文档中却表示BLOB和TEXT列不计入总行大小。解决方法是使用INNODB存储引擎,并切换到另一种存储机制Barracuda。

具体的解决步骤如下:

1. 设置全局变量innodb_file_format为Barracuda:SET GLOBAL innodb_file_format=Barracuda;,这个设置不会立即生效,因为它是用于新数据库文件的默认值,所以你需要删除并重新创建整个数据库。

2. 另一种解决方法是切换到Barracuda并开启文件-表策略:SET GLOBAL innodb_file_per_table=ON;,同样的,这个设置也不会立即生效,因为它是用于新表的默认值,所以你需要删除并重新创建表。

3. 在完成上述步骤后,你可以在MySQL数据文件夹中确认是否创建了单独的文件,例如,对于名为"data"的数据库和名为"test"的表,你应该能看到一个名为"data/test/bigtable.ibd"的文件。

4. 如果你不想改变MySQL的全局设置,可以尝试使用SET SESSION而不是SET GLOBAL,例如在运行CREATE TABLE语句之前使用。

5. 值得注意的是,你可以使用ALTER命令来修改已经创建的表的存储方式。

这个解决方法值得被认可,需要注意的是你可以使用ALTER命令来修改已经创建的表的存储方式。这个问题的原因是默认的配置设置下,Antelope存储引擎将变长列的前768个字节存储在行中。如果默认格式发生改变,这个解决方法可能就不再需要了。

0