mysql8.0.29执行sql时出现上述错误

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline;mysql8.0.29执行sql时出现上述错误,应该怎么解决?

原因:
1.表中数据多,产生的日志过多,默认的日志文件大小太小了;
2.不同引擎之间使用的存储格式不同。MyISAM有3种行存储格式:fixed/dynamic/compressed。InnoDb在MyIASM基础上新引入了Barracuda。至于不同引擎的默认设置,以及各种存储格式之间的区别,

3.解决方案
方式一:修改Mysql数据库配置文件
把Mysql数据库的my.ini配置项innodb_log_file_size=512M修改1024M,重启数据库服务就可以了。

方式二:修改其他引擎
方式三:
尝试在配置文件中添加以下选项:
要激活新文件格式: innodb_file_format = Barracuda
将每个表存储在自己的文件中: innodb_file_per_table = 1
为防止出现意外: innodb_strict_mode = ON
要存储长的可变长度列值,请对大型表使用动态或压缩行格式。
例如,使用ALTER TABLE LargeTable ENGINE = InnoDB ROW_FORMAT = DYNAMIC;

【导致问题的原因】

总结了下原因是因为mysql-innodb是按照page存储数据的,每个page max size是16k,然后每个page两行数据,所以每行最大8k数据。如果你的字段是blob之类的话,会存储在page之外的溢出区里。

但是innodb默认的approach(羚羊)存储格式会把每个blob字段的前864个字节存储在page里,所以你的blob超过一定数量的话,单行大小就会超过8k,所以就报错了

【解决思路】

解决方式是使用innodb的Barracuda(梭鱼) 存储格式

这种格式对blob字段的处理方式是在page里头只存储一个20byte大小的指针,其它全存在溢出区,所以你轻易超不了8k

参考GPT和自己的思路,该错误是因为行的大小超过了MySQL默认的限制(8126字节),需要采取以下一些解决方案:

更改数据类型:将数据类型从VARCHAR或CHAR更改为TEXT或BLOB,因为它们可以存储更多的数据,同时占用更多的空间。但是,请注意,这可能会影响查询性能。

更改行格式:更改行格式为ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED,以允许更大的行大小。这样可以将大的列(如BLOB)存储在独立的页中。

减少行大小:如果您无法更改数据类型或行格式,则可以尝试减少行大小。这可以通过将大的列拆分成多个较小的列,或者将表拆分成多个表来实现。

增加页大小:通过将页大小从默认的16KB增加到32KB或64KB,也可以允许更大的行大小。但是,请注意,这可能会影响内存使用和磁盘空间。

请注意,无论采取哪种解决方案,都应该在测试环境中进行测试,以确保不会影响数据完整性和查询性能。

以下答案引用自GPT-3大模型,请合理使用:

解决方案:
1. 把表中用于存储大数据量的列类型修改为TEXT类型或BLOB类型。
2. 使用ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED参数来压缩表元数据大小。

实例代码:
ALTER TABLE <table> MODIFY <column> text;
ALTER TABLE <table> ROW_FORMAT=DYNAMIC;

如果我的回答解决了您的问题,请采纳我的回答

这个错误通常是由于行大小超过MySQL限制所引起的。默认情况下,MySQL 8.0的最大行大小为8126个字节,而当一行的大小超过此限制时,就会出现“Row size too large”错误。

有几种方法可以解决这个问题:

1.将某些列更改为TEXT或BLOB类型:由于TEXT和BLOB类型的数据不会存储在行中,而是存储在专用的数据页中,因此将某些列更改为TEXT或BLOB类型可能会帮助解决该问题。需要注意的是,使用TEXT或BLOB类型的列可能会影响查询性能。

2.使用ROW_FORMAT=DYNAMIC或ROW_FORMAT=COMPRESSED:这些选项可以将行格式更改为动态行格式或压缩行格式,以容纳更大的行。

3.将BLOB前缀长度更改为更小的值:可以通过将innodb_log_block_size设置为更小的值来减小BLOB前缀长度,从而在行内存储更多的数据。但是,这可能会对性能产生负面影响。

要解决这个问题,可以尝试使用以上方法之一,具体取决于应用程序的要求和性能限制。

这个错误通常发生在 MySQL 的默认行格式 ROW_FORMAT=COMPACT 下,因为此格式在存储 BLOB 和 TEXT 类型数据时会将前 768 个字节直接存储在行记录中,而这个限制会导致行大小超过限制。

为了解决这个问题,你可以尝试以下几种方法:

1、修改表的行格式:可以将表的行格式改为 ROW_FORMAT=DYNAMICROW_FORMAT=COMPRESSED,这些格式可以避免将 BLOB 和 TEXT 数据存储在行记录中。例如,可以使用以下语句修改表的行格式:

ALTER TABLE table_name ROW_FORMAT=DYNAMIC;

2、将 BLOB 或 TEXT 列改为长文本列:可以将 BLOB 或 TEXT 列改为长文本列,这样可以避免将数据存储在行记录中。例如,可以使用以下语句将 blob_column 列改为长文本列:

ALTER TABLE table_name MODIFY blob_column LONGTEXT;

3、将数据分解为更小的块:可以将数据分解为更小的块,以避免单个行记录过大。例如,可以将 BLOB 或 TEXT 数据分解为多个 smaller_blob_column1、smaller_blob_column2 等列。这种方法可能需要修改应用程序代码来支持新的列。

请注意,在修改表结构之前,最好备份数据以避免数据丢失。同时,由于 ROW_FORMAT=COMPACT 是 MySQL 的默认行格式,如果你需要在不修改表结构的情况下避免这个问题,可以考虑将 MySQL 的全局行格式设置为 ROW_FORMAT=DYNAMIC,这样所有新建的表都会使用这个行格式。可以使用以下语句设置全局行格式:

SET GLOBAL innodb_default_row_format=DYNAMIC;

如果回答能帮到你,望采纳

可以采用下面的方法尝试解决
方法一:修改Mysql数据库配置文件
把Mysql数据库的my.ini配置项innodb_log_file_size=512M修改1024M,重启数据库服务。
方法二:
尝试在配置文件中添加以下选项:
要激活新文件格式: innodb_file_format = Barracuda
将每个表存储在自己的文件中: innodb_file_per_table = 1
为防止出现意外: innodb_strict_mode = ON
要存储长的可变长度列值,请对大型表使用动态或压缩行格式。
例如,使用ALTER TABLE LargeTable ENGINE = InnoDB ROW_FORMAT = DYNAMIC;

执行的sql应该是insert语句,里面的值过大,超过了表设计的字段长度限制,便会报此错误。若是insert的值可以缩减,考虑缩减,也可以修改下表字段类型,改为TEXT或者BLOB。

字段太长了,修改下格式把改为TEXT或者BLOB。

https://blog.csdn.net/u013131716/article/details/99712369