• 更新text字段时出现 Row size too large 报错


    起因:

    开发报告说更新时出错。
     
    更新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中优化了报错提示。
  • 相关阅读:
    Source Insight 安装使用
    size_t和ssize_t
    jquery ui autoComplete自动完成
    一个php类 Autoloader
    php register_shutdown_function
    mysql concat和group_concat
    nginx反向代理
    6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
    Sublime Text2 按shift键选择不了的问题
    javascript--瀑布流
  • 原文地址:https://www.cnblogs.com/cenalulu/p/2944343.html
Copyright © 2020-2023  润新知