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

(0)

相关推荐

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

    起因: 团购开发报告说更新时出错. 更新SQL如下: 复制代码 代码如下: UPDATE table_name d SET d.column_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' WHERE d.ID=100976; 报错信息如下: Error Code : 1118 Row si

  • Mysql 报Row size too large 65535 的原因及解决方法

    报错信息:Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535 向mysql的表插件一个字段 类型为text时,或修改一个字段类型为text时,报出上面的错误.其实我对这个错误的原因理解也不是很深,给出一些我查到的解释吧 大意是数据表中有一个设定长度为64K的字段索引,当表中字段(不知道是字段名字还是什么)不能超过这个长度,65,535所说明的是针对的是整个表的

  • Mybatis-Plus实现只更新部分字段的数据

    目录 Mybatis-Plus只更新部分字段数据 1.通过UpdateWrapper修改指定的列 2.使用场景和案例 Mybatis-Plus更新字段问题 spring-boot设置 属性设置有4种策略 Mybatis-Plus只更新部分字段数据 1.通过UpdateWrapper修改指定的列 update 时传入 null 是关键 重点语句:updateWrapper.set(“SESSION_KEY”, “abc”); this.mapper.update(null, wrapperUpda

  • MYSQL替换时间(年月日)字段时分秒不变实例解析

    写法1: update sas_order_supply_month_pay set RECEIVE_TIME=REPLACE(RECEIVE_TIME,DATE_FORMAT(RECEIVE_TIME,'%Y-%m-%d'),(select PERIOD_END from sas_task_supply_month_pay_period where belong='1729' and CREATE_TIME like '%2017-07-12%')) where ORDER_CODE='PO2

  • MSSQL数据库获取TEXT字段的内容长度

    SQL Server数据库如何获取TEXT字段的内容长度的方法,是通过DATALENGTH函数来实现的,接下来我们就通过DATALENGTH函数的语法及使用实例来了解一下这部分内容. DATALENGTH用来返回任何表达式所占用的字节数. 语法:DATALENGTH ( expression ) 参数:expression,任何类型的表达式. 返回类型:int 注释:DATALENGTH 对 varchar.varbinary.text.image.nvarchar 和 ntext 数据类型特别

  • SQL Server Bulk Insert 只需要部分字段时的方法

    根据一般做法的话,导出部分字段时没有办法生成格式化XML文件,所以导入时就没有办法格式化导入数据. 我想到两点,1.手工修改格式化XML文件,2.创造一个能生成格式化XML文件的中间对象. 在MSDN中寻找方法时,突然想到可以使用视图来做中间对象,于是就搭一个测试下.以下是测试记录: 复制代码 代码如下: USE master GO CREATE DATABASE [db_test] GO USE db_test GO CREATE TABLE dbo.T_test( ID [int] IDEN

  • 除MSSQL数据库text字段中恶意脚本的删方法

    方法很简单:text字段不能使用Replace,所以使用patindex 复制代码 代码如下: -select * from Product where P_Intro like '%<script src="http://my.stsw518.cn/a002/1.js" src="http://my.stsw518.cn/a002/1.js"></script>%' --text字段的替换处理示例--全表替换 -- select datal

  • laravel model模型处理之修改查询或修改字段时的类型格式案例

    先了解一下此图,有助于理解 通过上图了解 这将在原有的列上添加一列is_admin,这需要通过属性访问时才会获得,如果我们希望在获得数据的时候被一起返回,则还需要append属性 class User extends Model{ //设置方法名称 protected $appends = ['is_admin','type']; //查询时 修改 字段格式或者值 [自动触发,无需调用] public function getIsAdminAttribute() { return $this->

  • thinkphp5.1的model模型自动更新update_time字段实例讲解

    1.model模型开启自动完成时间戳功能 <?php namespace app\common\model; use think\Model; use think\Db; class User extends Model{ //开启自动完成时间戳功能 protected $autoWriteTimestamp = true; } ?> 2.使用update方法更新 User::update(['name'='安阳'],['id'=>1]); Thinkphp中update方法的源代码如下

  • Mybatis Plus查询时sql字段名大小写报错的解决

    目录 Mybatis Plus查询时sql字段名大小写报错 遇到报错 错误解析 解决方案 Mybatis Plus返回map大小写问题 Mybatis Plus查询时sql字段名大小写报错 遇到报错 错误解析 在数据库中没有找到img_url 列 数据库字段名是是大写 解决方案 在application.properties中加: mybatis-plus.configuration.map-underscore-to-camel-case=false 完美运行~ Mybatis Plus返回m

随机推荐