一、背景

我们的MySQL数据库有一张10个Text的字段的表,还包括几个char和varchar字段,由于业务需求,我在表中加多一个Text字段的时候,插入记录的出现了下面的错误:

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

(图1:错误信息)

二、过程

首先我们执行下面的SQL,查看这个表的相关信息:

SHOW TABLE STATUS LIKE 'eventanalysis%';

(图:表信息)

从上面的这个表使用的Row_format是Compact,这个跟我们上面出现的错误有什么关系呢?

首先让我们来了解下Row_format的Compact,【MySQL技术内幕InnoDB存储引擎】书中的第4.4节(83-98页)中提到:

1.      Compact行记录是在MySQL 5.0时被引入的,其设计目标是能高效存放数据。

2.      Redundant是MySQL 5.0版本之前InnoDB的行记录存储方式。

3.      InnoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,即作为行溢出数据。一般认为BLOB、LOB这类的大对象列类型的存储会把数据存放在数据页面之外,这个理解有点偏差,BLOB可以不将数据放在溢出页面,而即使是varchar列数据类型,依然有可能存放为行溢出数据。

4.      Oracle VARCHAR2最大存放4000个字节,SQL Server 最大存放8000个字节,MySQL的VARCHAR可以存放65535个字节。

5.      TXET(一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。)

6.      MEDIUMTEXT(一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。)

7.      VARCHAR(N)中,N指的是字符的长度,VARCHARL类型最大支持65535指的是65535个字节。

8.      在Compact行记录中,数据页只保存数据的钱768个字节,实际数据保存在BLOB页中。

9.      Barracuda文件格式下拥有两种新的行记录格式Compressed和Dynamic两种,新的两种格式对于存放BLOB的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际的数据都存放在BLOB Page中,而之前的Compact和Redundant两种格式会存放768个前缀字节。Compressed行记录格式的另一个功能就是存储在其中的数据会以zlib的算法进行压缩。

通过上面的一些了解,MySQL默认是使用Compact行记录的,所以我决定修改表结构,修改为Barracuda中的Compressed行记录。

在创建表的SQL语句中加入粗体内容:ENGINE=INNODB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

(一) 执行创建表SQL的时候出现下面的错误信息:

0 row(s) affected, 2 warning(s)

Execution Time : 0.090 sec

Transfer Time  : 1.066 sec

Total Time     : 1.056 sec

Warning Code : 1478

InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table.

Warning Code : 1478

InnoDB: assuming ROW_FORMAT=COMPACT.

(二) 根据上面的提示,设置innodb_file_per_table,重启MySQL后,再次执行创建表SQL,出现下面的错误:

135 row(s) affected, 2 warning(s)

Execution Time : 4.004 sec

Transfer Time  : 1.064 sec

Total Time     : 5.069 sec

Warning Code : 1478

InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope.

Warning Code : 1478

InnoDB: assuming ROW_FORMAT=COMPACT.

(三) 根据提示,执行下面的SQL:SET GLOBAL innodb_file_format='Barracuda';再次执行创建表的SQL,这次终于成功了,没有报错了。通过SQL:SHOW TABLE STATUS LIKE 'eventanalysis%';查看新表(eventanalysis4)信息:

(图:row_format)

三、解决步骤

1.      在MySQL的配置文件中添加:

[mysqld]

max_allowed_packet=16M

2.      在MySQL的配置文件中添加:

[mysqld]

innodb_file_per_table=1

3.      修改MySQL全局变量:

SET GLOBAL innodb_file_format='Barracuda';

4.      删除原表,创建一个新表,并设置表的属性:

ROW_FORMAT=COMPRESSED

四、知识点

ROW_FORMAT几个典型值:

ROW_FORMAT=COMPACT

ROW_FORMAT=REDUNDANT

ROW_FORMAT=COMPRESSED

ROW_FORMAT还有其他一些值:

DEFAULT

FIXED

DYNAMIC

COMPRESSED

REDUNDANT

COMPACT

MySQL多Text字段报8126错误(解决过程)的更多相关文章

  1. SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法

    使用SpringMVC开发的时候,页面如果有日期格式的数据,后台接受也是java.util.Date,则报告400错误 .下面是解决方案的演示示例: 这个是实体类,里面createDate就是java ...

  2. mysql创建外链失败1005错误解决方法

    mysql创建外链失败1005错误解决方法 错误号:1005错误信息:Can't create table 'webDB.#sql-397_61df' (errno: 150)解决方法 错误原因有四: ...

  3. mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value

    一.问题描述 在往数据库写入数据的时候,报错: '字段名' doesn't have a default value 本来这个错误是经常见到的,无非就是字段没有设置默认值造成的.奇怪的是,我这边报错的 ...

  4. linux下遇见mysql启动报2002错误解决办法

    前言:目前问题解决了,但是仍不知道是什么原因造成的,在出现问题前安装uWSGI后,mysql就出现这个问题的,哪位大侠说说这是怎么回事? 正文:Linux 下 Mysql error 2002 错误解 ...

  5. virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法

    最近在virtualbox中安装了Ubuntu 14,配置了一个mysql server,设置的桥接网络模式.在其他电脑连接的时候,总是报2003错误.开始以为是localhost没有置换为%,运行u ...

  6. MySQL之text字段

    TEXT类型一般分为 TINYTEXT(255长度).TEXT(65535). MEDIUMTEXT(int最大值16M),和LONGTEXT(long最大值4G)这四种,它被用来存储非二进制字符集, ...

  7. mybatis 批量update报语法错误解决方法

    1.为什么会报语法错误 原因:在 *.xml文件内使用了循环,在mybatis中默认是不允许使用批量修改. <update id="setMaxMin" parameterT ...

  8. Nginx 反向代理报400错误解决方法!

    如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败,报400错误,解决办法: ...

  9. LR报-27727错误解决办法

    1.报如下错误:Action.c(4):Error-27727:Step download timeout(120 seconds) has expired when downloading reso ...

随机推荐

  1. python抓取历年特码开奖记录

    背景: 小时候,有种游戏,两个主人公:白XX和曾XX,每个家庭把他俩像活菩萨一样供着,供他们吃,供他们穿 做生意的老板为了这两位活菩萨,关门大吉 农民为了这两位活菩萨卖牛卖田变卖家产 做官的为了这两位 ...

  2. javascript中的事件Event

    一.事件流 1.事件流:描述的是从页面中接受事件的顺序 IE的事件流是事件冒泡流,Netscape的事件流是事件捕获流. 2.事件冒泡 IE的事件流叫做事件冒泡(event bubbing),即事件开 ...

  3. 摧枯拉朽,说说ES6的三把火

    阅读目录 我是 Jser 我骄傲 作用域 模块系统 类(Class) 我是 Jser 我骄傲 JavaScript 如今可谓是屌丝逆袭高富帅的代名词哈,从当初闹着玩似的诞生到现在 Github 上力压 ...

  4. 基于apache httpclient 调用Face++ API

    简要: 本文简要介绍使用Apache HttpClient工具调用旷世科技的Face API. 前期准备: 依赖包maven地址: <!-- https://mvnrepository.com/ ...

  5. 【二十一】基于mysqli的表格数据练习

    mysqlitest.php <?php //调用数据库的函数 function connetionsql(){ $conn=mysqli_connect("127.0.0.1&quo ...

  6. iOS控制器跳转动画

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 MyViewController *myVC = [[MyViewController alloc]init];  //创建动画  C ...

  7. Oracle11g不能导出空表问题

    ORACLE 11g 用exp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立.后来发现是所有的空表都没有导出来.于是想好好查查,因为在以前的 ...

  8. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. 关于C++函数返回局部对象的详细分析

    以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通 ...

  10. DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍

    一.计算机视觉 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计算量会巨大,显然这不现实.所以需要引入其他的方法来 ...