服务器之家

服务器之家 > 正文

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

时间:2019-12-19 14:25     来源/作者:MYSQL教程网

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

更新SQL如下: 

复制代码代码如下:


UPDATE table_name d SET d.column_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' 
WHERE d.ID=100976; 


报错信息如下: 
Error Code : 1118 
Row 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中优化了报错提示。

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
返回顶部