当前位置: 首页 > news >正文

1118-Row size too large.The maximum row size for the used table type,not counting BLOBs,is 65535

MySQL 1118错误完整解决方案 | Row size too large 实战指南

摘要:本文详细记录了一次MySQL行大小超限错误的排查与解决过程,从问题现象到根本原因,再到多种解决方案,帮助你彻底理解并解决此类问题。


📋 一、问题背景

环境信息

项目
MySQL版本8.0.22
存储引擎InnoDB
字符集utf8mb4
字段名transform_script
原类型VARCHAR(1080)

错误信息

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

🔍 二、问题排查过程

第一次尝试 ❌

-- 错误操作:单纯增加字段长度 ALTER TABLE your_table MODIFY COLUMN transform_script VARCHAR(10800);

结果:报错依旧,甚至更严重

问题分析

为什么增加长度反而问题更严重?

因素说明
字符编码utf8mb4下一个字符最多占用4字节
长度前缀VARCHAR需要1-2字节存储长度信息
行开销表头、空值标记等约几十字节开销
其他字段表中其他字段也会占用行空间

计算演示

VARCHAR(10800) 潜在最大占用: = 10800 × 4字节 + 长度前缀 ≈ 43200 + 2 字节 ≈ 43202 字节 如果表中有其他字段(如 INT、DATETIME 等) + 行头开销(约 40-50 字节) 总长度可能超过 65535 字节限制!

💡 三、核心原因解析

InnoDB 行大小限制

┌─────────────────────────────────────────────────────────┐ │ MySQL InnoDB 行大小限制 │ ├─────────────────────────────────────────────────────────┤ │ 最大行大小:65535 字节(不包括 BLOB/TEXT 的实际内容) │ │ 包含内容:所有固定长度字段 + VARCHAR 实际数据 + 行开销 │ │ 特殊情况:某些版本/配置下行内存储限制为 8126 字节 │ └─────────────────────────────────────────────────────────┘

为什么 VARCHAR 会触发限制?

  1. VARCHAR 是行内存储:数据直接存储在行中
  2. 按最大长度计算:即使实际数据很小,也会按定义的最大长度预留空间
  3. utf8mb4 放大效应:1个字符 = 最多4字节

✅ 四、解决方案

方案一:改为 TEXT 类型(推荐 ⭐)

-- 表已存在时使用 ALTER ALTER TABLE your_table_name MODIFY COLUMN transform_script MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '存储转换脚本';

方案二:新建表时直接定义

CREATE TABLE your_table_name ( id INT PRIMARY KEY AUTO_INCREMENT, transform_script MEDIUMTEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

类型选择参考表

类型最大长度适用场景
TEXT64KB (65,535字节)短文本、备注
MEDIUMTEXT16MB脚本存储、文章内容
LONGTEXT4GB超大文档、日志

🛠️ 五、最佳实践建议

1. 字段类型选择原则

存储内容长度预期 推荐类型 ───────────────────────────────────── < 255 字符 VARCHAR(255) 255 ~ 1000 字符 VARCHAR(1000) > 1000 字符 或 不确定 TEXT / MEDIUMTEXT 存储脚本/代码/大文本 MEDIUMTEXT ✅

2. 建表时注意事项

-- ✅ 推荐:明确指定字符集和排序规则 CREATE TABLE example ( id INT PRIMARY KEY, content MEDIUMTEXT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ❌ 避免:依赖默认设置,可能导致不一致 CREATE TABLE example ( id INT PRIMARY KEY, content VARCHAR(10000) -- 可能触发行大小限制 );

3. 迁移数据时的完整脚本

-- 步骤1:备份原表 CREATE TABLE your_table_backup AS SELECT * FROM your_table; -- 步骤2:修改字段类型 ALTER TABLE your_table MODIFY COLUMN transform_script MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 步骤3:验证数据 SELECT COUNT(*) FROM your_table; SELECT LENGTH(transform_script) FROM your_table LIMIT 5; -- 步骤4:确认无误后删除备份(可选) -- DROP TABLE your_table_backup;

⚠️ 六、注意事项

注意项说明
索引限制TEXT 字段不能直接创建普通索引,需使用前缀索引
查询性能TEXT 类型查询可能比 VARCHAR 稍慢
排序操作TEXT 字段排序需要注意内存限制
备份恢复大文本字段会增加备份文件大小

TEXT 字段创建索引示例

-- 前缀索引(推荐) CREATE INDEX idx_script_prefix ON your_table(transform_script(255)); -- 全文索引(适用于搜索场景) CREATE FULLTEXT INDEX idx_script_fulltext ON your_table(transform_script);

📝 七、总结

问题根源

MySQL InnoDB 引擎对单行数据大小有65535字节的硬性限制,VARCHAR 字段按最大长度计算占用空间,utf8mb4 编码会放大实际占用。

解决思路

将大字段从行内存储改为行外存储,使用 TEXT/MEDIUMTEXT 类型,其实际内容不计入行大小限制。

核心建议

  1. 超过1000字符的文本字段,优先考虑 TEXT 类型
  2. 脚本、代码、文章内容等,直接使用 MEDIUMTEXT
  3. 建表时明确指定字符集,避免默认值带来的不确定性
http://www.jsqmd.com/news/514265/

相关文章:

  • 为M2LOrder服务配置内网穿透:实现本地开发环境的远程调试
  • Lattice3.10新手必看:从新建项目到下载程序的完整流程(附VScode编写技巧)
  • 从农业到地质:高光谱遥感数据集在不同领域的应用实例解析
  • 嵌入式函数返回值设计:0成功与错误分类工程实践
  • AI入门必看:从零开始掌握人工智能核心概念(附学习路线图)
  • Scratch编程等级考试1~4级真题解析与备考策略
  • 鸟类虚拟解剖实验平台
  • Nanbeige 4.1-3B快速部署:WSL2环境下Windows一键启动指南
  • 2026 Cinema 4D渲染引擎排名(50万+农场作业数据)+ C4D云渲染推荐
  • 含SVG的风电并网系统稳定性分析与优化
  • Android 禁止侧载将正式实施,需要等待 24 小时冷静期
  • Phi-3-vision-128k-instruct赋能STM32开发:嵌入式AI视觉应用快速原型设计
  • 永磁同步直线电机 PMLSM 矢量控制滑模控制 SVPWM 仿真模型探究
  • 直接上结论:更贴合论文写作全流程的AI论文工具,千笔·专业论文写作工具 VS speedai
  • 避坑指南:ESP32测WiFi信号强度(RSSI)和吞吐量,这几个参数设置错了等于白测
  • RS-485与 CAN电平特性分析与对比
  • 全球首个包含全工具链的运维智能体 x OpenClaw组合登场
  • ClawdBot惊艳效果:餐厅菜单照片→自动识别菜名/价格/辣度图标→生成双语点餐卡
  • 我的桌面氛围灯就靠它了:STM32F103C8T6 + PWM + 电容触摸,做一个能调亮度的迷你台灯
  • 毫米波雷达点云分割模型优化:基于PointNet的改进与性能突破
  • [特殊字符] 学生党必备!Steam游戏一键入库神器,白漂党狂喜
  • Pi0具身智能v1物流应用:自动化分拣机器人系统开发
  • SenseVoice ONNX量化模型部署教程:高效推理与低资源占用方案
  • MedGemma Medical Vision Lab环境部署:Ubuntu 22.04 + PyTorch 2.3 + CUDA 12.1配置详解
  • 2026年高并发压测工具实测推荐!
  • eNSP模拟器下华为交换机VLAN通信实验:从理论到实践的保姆级教程
  • 2026年苏州桦源电力品牌发电机出租,全功率机型随租随用 - 海棠依旧大
  • AI率99%→5%!实测2025年真正有用的6款降AI率工具!纯干货
  • 用Python+OpenCV实现视频马赛克检测:从边缘检测到方块统计的完整流程
  • ZS315+VL171 实现Type-C母转DP公转接头 体积轻巧,随身携带