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;
如果我的回答解决了您的问题,请采纳我的回答
更改数据库引擎为MyISAM。即上述代码中Engine=MyISAM
这个错误通常是由于行大小超过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=DYNAMIC
或 ROW_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。