0


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

文章目录

问题

  • 当我们创建表或新增字段时,我们可能遇到下面这个问题:
1118-Row size too large. The maximum row size for the used tabletype,not counting BLOBs,is65535. 
This includes storage overhead,check the manual. You have to change somecolumnstoTEXTor BLOBs
  • 大概的意思是说:行的大小过大,最大限制为 65535 ,其中不包括 TEXT or BLOB 类型,建议调整一些列为 TEXT or BLOB 类型。
  • 下面我们来具体分析一下这个问题,并探讨如何解决。

原因

  • MySQL 行大小最大限制为65535,不包括TEXT、BLOB。
  • 注:如果未启用严格 SQL 模式, VARCHAR长度规范大于 65535 的列将转换为 TEXT, VARBINARY长度规范大于 65535 的列将转换为 BLOB。否则,在这两种情况下都会发生错误。
  • 参考:MySQL 5.7 官方文档:13.1.18.6 Silent Column Specification Changes

问题复现

环境 & 版本

SELECT VERSION();5.7.36-log

复现过程

  • 尝试创建一个表 “tb_test”:
CREATETABLE tb_test (
    row1 VARCHAR(10000)DEFAULTNULL,
    row2 VARCHAR(10000)DEFAULTNULL,
    row3 VARCHAR(10000)DEFAULTNULL)ENGINE=INNODBDEFAULTCHARSET= utf8;// 创建失败1118-Row size too large. The maximum row size for the used tabletype,not counting BLOBs,is65535. 
This includes storage overhead,check the manual. You have to change somecolumnstoTEXTor BLOBs

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

解决方案

调整列大小

  • 调整列大小使行大小 <= 65535。
CREATETABLE tb_test (
    row1 VARCHAR(10000)DEFAULTNULL,
    row2 VARCHAR(10)DEFAULTNULL,
    row3 VARCHAR(10000)DEFAULTNULL)ENGINE=INNODBDEFAULTCHARSET= utf8;

tb_test 行长度为:10000*3*2+10*3=60020 字节 <63335// 创建成功CREATETABLE tb_test (
    row1 VARCHAR(10000)DEFAULTNULL,
    row2 VARCHAR(10)DEFAULTNULL,
    row3 VARCHAR(10000)DEFAULTNULL)ENGINE=INNODBDEFAULTCHARSET= utf8
> OK
> 查询时间: 0.087s

调整列类型

  • 调整其中部分列类型为 TEXT or BLOBs(不计入行大小),使行大小 <= 65535。
CREATETABLE tb_test(
    row1 VARCHAR(10000)DEFAULTNULL,
    row2 textDEFAULTNULL,
    row3 VARCHAR(10000)DEFAULTNULL)ENGINE=INNODBDEFAULTCHARSET= utf8

将 row2 调整为 text 类型
tb_test 行长度为:10000*3*2=60000 字节 <63335// 创建成功CREATETABLE tb_test(
    row1 VARCHAR(10000)DEFAULTNULL,
    row2 textDEFAULTNULL,
    row3 VARCHAR(10000)DEFAULTNULL)ENGINE=INNODBDEFAULTCHARSET= 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编程。

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

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

标签: mysql 数据库

本文转载自: https://blog.csdn.net/qq_35578171/article/details/134888413
版权归原作者 Lorin 洛林 所有, 如有侵权,请联系我们删除。

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

还没有评论