MySQL的"Row size too large"错误场景

2024年 7月 5日 59.9k 0

点击标题下「蓝色微信名」可快速关注

MySQL中建表,提示了这个错误,

    SQL 错误 [1118] [42000]: Row size too large. 
    The maximum row size for the used table type, 
    not counting BLOBs, is 65535. 
    This includes storage overhead, check the manual. 
    You have to change some columns to TEXT or BLOBs

    从说明来看,写得很清楚了,"Row size too large"行定义太长了。

    MySQL数据表存储数据,需要根据表结构中字段的数据类型和长度来分配存储空间。每条记录的大小必须小于或等于MySQL的最大行大小限制。如果表的行大小超过了这个限制,就会出现"Row size too large"的错误。

    MySQL的最大行大小限制由多个因素决定,包括表的存储引擎、MySQL版本等。在InnoDB存储引擎中,默认的最大行大小为65535字节。这个大小包括了所有的列数据、行头和一些其它的开销。

    解决方案有几种。

    方案1. 减少列的数量和大小

    尽量减少表结构中列的数量和大小。可以考虑删除一些不必要的列或者将一些较长的列改为较短的数据类型。

    方案2. 使用TEXT或BLOB类型存储大文本数据

    如果表中包含较大的文本数据,可以将对应的列的数据类型改为TEXT或BLOB类型。这些类型的数据在存储时不会被计入行大小的限制。

    方案3. 调整InnoDB的配置参数

    可以通过调整InnoDB的配置参数来增加最大行大小限制。例如修改innodb_file_format、innodb_file_per_table和innodb_large_prefix等参数。

      SET GLOBAL innodb_file_format = Barracuda;
      SET GLOBAL innodb_file_per_table = ON;
      SET GLOBAL innodb_large_prefix = 1;

      个人建议推荐方案是1>2>3。

      如果一张表所有字段长度达到了65536个字节,除非有特定场景,否则听起来,这就不是很合理,需要存什么信息,能存这么多?表结构设计上,是否符合范式?这些都需要考虑。即使实际场景,就需要存储这么多内容,建议用TEXT、BLOB这些数据类型。改系统参数,毕竟影响全局,还是要考虑,改动所带来各方面的影响,综合决策才行,不能仅仅为了这么一个场景,而且不太了解参数背景的前提下,就改个全局参数,很容易出现不可控的问题。

      如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,

      MySQL的"Row size too large"错误场景-1

      近期更新的文章:《云原生架构体系讲解》
      《JSON字符串解析实践》《金融大模型应用的机遇与挑战》
      《MySQL 5.7升级8.0的INT的显示问题场景》《坐橐儿》
      热文鉴赏:《中国队“自己的”世界杯》《你不知道的C罗-Siu庆祝动作》《架构设计的15个关键概念》
      《大阪环球影城避坑指南和功略》
      《推荐一篇Oracle RAC Cache Fusion的经典论文》
      《"红警"游戏开源代码带给我们的震撼》
      文章分类和索引:《公众号1500篇文章分类和索引》

      相关文章

      Oracle如何使用授予和撤销权限的语法和示例
      Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
      下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
      社区版oceanbase安装
      Oracle 导出CSV工具-sqluldr2
      ETL数据集成丨快速将MySQL数据迁移至Doris数据库

      发布评论