mysql创建表时出错ERROR 1118 (42000): Row size too large.(> 8126).
MySQL8.0.32
创建一张表,包含263列,其中varchar类型有217个,其余大多是TIMESTAMP和INT
第一次执行出错后 我把varchar(>1000)的8个列设置成了TEXT类型,还是出错
第二次 有继续调整 把varchar(=200) 的也设置成TEXT,同时修改varchar(=100)—>varchar(50),依然出错
两次调整后,表中有3个varchar(100),75个varchar(50),123个varchar(20)
我现在考虑把varchar都改成TEXT类型,又担心后续使用TEXT类型不方便,希望得到更好的解决办法
参考GPT和自己的思路:
这个问题是由于表中行的大小超过了MySQL所允许的最大值(8126 bytes)而导致的。在这种情况下,您可以尝试以下解决方案:
减少行的大小:尝试删除一些不必要的列或将一些varchar类型转换为更小的类型(如char或text)。
分割表:如果您需要所有列,可以考虑将表分割成几个表,并使用外键将它们连接起来。
更改配置:如果您使用的是InnoDB存储引擎,则可以尝试在mysql的配置文件中更改innodb_log_file_size
和innodb_page_size
的值以增加行的大小限制。
总的来说,建议您重新审视您的数据库设计,考虑优化表结构和数据类型以提高性能和有效性。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个错误是因为MySQL在创建表时会限制每行的最大大小,通常是65535个字节。如果您在表中定义了太多的列,并且它们的大小相加超过了这个限制,那么就会出现这个错误。
在这种情况下,可以尝试以下几种方法:
减少列的数量或缩小列的大小
如果您能减少列的数量或缩小列的大小,那么表的总大小就会减小,从而避免这个错误。您可以尝试使用VARCHAR替代TEXT类型,并适当缩小VARCHAR列的大小。
使用垂直分割或水平分割
如果您无法减少列的数量或缩小列的大小,那么可以考虑使用垂直分割或水平分割的方法。垂直分割是指将表中的列分成两个或更多的表,而水平分割是指将表中的行分成两个或更多的表。这样可以减少每个表的大小,从而避免这个错误。
调整MySQL的配置参数
如果您不能减少列的数量或缩小列的大小,并且垂直分割或水平分割也不可行,那么可以尝试调整MySQL的配置参数。您可以尝试调整max_allowed_packet、innodb_log_file_size、innodb_log_buffer_size、innodb_buffer_pool_size等参数。请注意,调整这些参数可能会影响数据库的性能和稳定性,应该谨慎操作。
希望以上方法能帮到您解决问题。
没有办法的,varchar长度不够,只能改成text的。你要担心的是后期上线以后,你的varchar长度,能不能够满足业务需要,别上线以后又出现bug。
具体什么格式类型的话,都一样,对于MySQL不差这点存储空间的。
我一般超过255,或者255都不够的,直接改为text的。不出错就行。
-- N个列
create table info (
......
) ENGINE = InnoDB ROW_FORMAT = Dynamic;
row数据太多,行数太多