更新text字段时出现Row size too large报错应付措施

2022-11-12 09:30:29
内容摘要
这篇文章主要为大家详细介绍了更新text字段时出现Row size too large报错应付措施,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!起因:团
文章正文

这篇文章主要为大家详细介绍了更新text字段时出现Row size too large报错应付措施,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

起因:团购开发报告说更新时出错。更新SQL如下

代码如下:

 
UPDATE table_name d SET d.column_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
WHERE d.ID=100976; 
报错信息如下:Error Code : 1118Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs疑惑:更新字段只涉及 column_name字段,且该字段是TEXT类型。个人之前理解是:TEXT的内容在 Dynamic的table format下是存在off-page中的,不会占用row size的计算。Barracuda 对应row_format ( dynamic, compress) ,其中dynamic下text的所有内容都是off-page存放的 (点击查看)Antelope 对应row_format (compact, redundant),其中compact下的text是存786B在row中,超过部分存在off-page而服务器配置是 innodb_file_format = Barracuda照理说所有table用的都是 dynamic 结构。但是! 原因如下,摘自文档:To preserve compatibility with those prior versions, tables created with the InnoDB Plugin use the prefix format, unless one of ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED is specified (or implied) on the CREATE TABLE command.也就是说,建表时不显示指定 row_format = dynamic ,即使 innodb_file_format = Barracuda 表的row-format还是 compact所以总结为一句话就是:如果某个表的text字段很多建议建表时加上 row_format = dynamic当然,回过头来MySQL的报错也是有误导性的,bug库中也对confirm了这个bug(点击查看),并在5.1.61中优化了报错提示。

注:关于更新text字段时出现Row size too large报错应付措施的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!