更新text字段时出现Row size too large报错应付措施_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2566 | 回复: 0   主题: 更新text字段时出现Row size too large报错应付措施        下一篇 
wongz
注册用户
等级:新兵
经验:46
发帖:55
精华:0
注册:2011-8-6
状态:离线
发送短消息息给wongz 加好友    发送短消息息给wongz 发消息
发表于: IP:您无权察看 2014-11-13 9:27:00 | [全部帖] [楼主帖] 楼主

起因:

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

    更新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中优化了报错提示。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论