MySQL:1118 - Row size too large(行大小不能超过 65535 问题)

文章目录

问题

  • 当我们创建表或新增字段时,我们可能遇到下面这个问题:
sql 复制代码
1118 - 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
  • 大概的意思是说:行的大小过大,最大限制为 65535 ,其中不包括 TEXT or BLOB 类型,建议调整一些列为 TEXT or BLOB 类型。
  • 下面我们来具体分析一下这个问题,并探讨如何解决。

原因

问题复现

环境 & 版本

sql 复制代码
SELECT VERSION();

5.7.36-log

复现过程

  • 尝试创建一个表 "tb_test":
sql 复制代码
CREATE TABLE tb_test (
	row1 VARCHAR ( 10000 ) DEFAULT NULL,
	row2 VARCHAR ( 10000 ) DEFAULT NULL,
	row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;

// 创建失败
1118 - 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

// 为什么创建失败
tb_test 使用 CHARSET = utf8,每个编码字符占 3 个字节
则 tb_test 行长度为:1000 * 3 * = 90000 字节 > 63335
因此创建表失败

解决方案

调整列大小

  • 调整列大小使行大小 <= 65535。
sql 复制代码
CREATE TABLE tb_test (
	row1 VARCHAR ( 10000 ) DEFAULT NULL,
	row2 VARCHAR ( 10 ) DEFAULT NULL,
	row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;

tb_test 行长度为:10000 * 3 * 2 + 10 *3  = 60020 字节 < 63335

// 创建成功
CREATE TABLE tb_test (
	row1 VARCHAR ( 10000 ) DEFAULT NULL,
	row2 VARCHAR ( 10 ) DEFAULT NULL,
	row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8
> OK
> 查询时间: 0.087s

调整列类型

  • 调整其中部分列类型为 TEXT or BLOBs(不计入行大小),使行大小 <= 65535。
sql 复制代码
CREATE TABLE tb_test(
	row1 VARCHAR ( 10000 ) DEFAULT NULL,
	row2 text DEFAULT NULL,
	row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8

将 row2 调整为 text 类型
tb_test 行长度为:10000 * 3 * 2 = 60000 字节 < 63335

// 创建成功
CREATE TABLE tb_test(
	row1 VARCHAR ( 10000 ) DEFAULT NULL,
	row2 text DEFAULT NULL,
	row3 VARCHAR ( 10000 ) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8
> OK
> 查询时间: 0.023s

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

相关推荐
sevenll0712 分钟前
SqlKit - 覆盖 50+ 数据库的 AI 智能体 SQL 桌面客户端
数据库·人工智能·sql·智能体
数智化管理手记3 小时前
手工统计指标误差大、效率低?指标管理系统如何告别人工算数痛点?
大数据·运维·数据库·人工智能·云计算
ShiXZ2139 小时前
Redis 常用指令全集:redis-cli 实战速查手册
数据库·redis·缓存
晓子文集9 小时前
Tushare接口文档:期货日线行情(fut_daily)
大数据·数据库·金融数据·量化投资·tushare
WA内核拾荒者10 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
龙仔72513 小时前
人大金仓OS_Core数据库自动备份实施笔记(银河麒麟Linux)
linux·数据库·笔记·备份·人大金仓
老杨聊技术14 小时前
CentOS 7 安装 MySQL 8 保姆级教程
linux·mysql·centos
sunxr.22714 小时前
Mysql-----最后一次作业
数据库·mysql
普通网友14 小时前
Python FastAPI 异步数据库管理
数据库·fastapi
晓子文集14 小时前
Tushare接口文档:期货合约信息表(fut_basic)
大数据·数据库·金融·金融数据·量化投资