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

2023-12-10 16:05:15 浏览数 (1)

问题

  • 当我们创建表或新增字段时,我们可能遇到下面这个问题:
代码语言: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 类型。
  • 下面我们来具体分析一下这个问题,并探讨如何解决。

原因

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

问题复现

环境 & 版本

代码语言: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

个人简介

0 人点赞