MySQL多Text字段报8126错误(解决过程)
一、背景
我们的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错误(解决过程)的更多相关文章
- SpringMVC提交数据遭遇基础类型和日期类型报400错误解决方法
使用SpringMVC开发的时候,页面如果有日期格式的数据,后台接受也是java.util.Date,则报告400错误 .下面是解决方案的演示示例: 这个是实体类,里面createDate就是java ...
- mysql创建外链失败1005错误解决方法
mysql创建外链失败1005错误解决方法 错误号:1005错误信息:Can't create table 'webDB.#sql-397_61df' (errno: 150)解决方法 错误原因有四: ...
- mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value
一.问题描述 在往数据库写入数据的时候,报错: '字段名' doesn't have a default value 本来这个错误是经常见到的,无非就是字段没有设置默认值造成的.奇怪的是,我这边报错的 ...
- linux下遇见mysql启动报2002错误解决办法
前言:目前问题解决了,但是仍不知道是什么原因造成的,在出现问题前安装uWSGI后,mysql就出现这个问题的,哪位大侠说说这是怎么回事? 正文:Linux 下 Mysql error 2002 错误解 ...
- virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法
最近在virtualbox中安装了Ubuntu 14,配置了一个mysql server,设置的桥接网络模式.在其他电脑连接的时候,总是报2003错误.开始以为是localhost没有置换为%,运行u ...
- MySQL之text字段
TEXT类型一般分为 TINYTEXT(255长度).TEXT(65535). MEDIUMTEXT(int最大值16M),和LONGTEXT(long最大值4G)这四种,它被用来存储非二进制字符集, ...
- mybatis 批量update报语法错误解决方法
1.为什么会报语法错误 原因:在 *.xml文件内使用了循环,在mybatis中默认是不允许使用批量修改. <update id="setMaxMin" parameterT ...
- Nginx 反向代理报400错误解决方法!
如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败,报400错误,解决办法: ...
- LR报-27727错误解决办法
1.报如下错误:Action.c(4):Error-27727:Step download timeout(120 seconds) has expired when downloading reso ...
随机推荐
- libmemcached的安装及測试
1.安装memcached ~$ wget http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz. $ tar xvzf lmemc ...
- mock.js的真实数据模拟
哈哈,怎么说,这应该是我的第一个随笔了,毕竟前端之路上一直在学习并且各位大神们的经验,虽然也有不少的坑,但是总是收获比较多,所以我也想把一些收获记录下来,有需要的可以参考参考. 网上看了不少大神很多例 ...
- idea配置svn
建议使用第二种方式比较简本人是使用第二种方式比较简单, 解决更新svn项目到本地报错的问题. ntelliJ IDEA 管理项目是十分的方便的,但有的小伙伴初次使用时,可能会遇到使用svn更新项目至本 ...
- spark-submit参数说明--standalone
示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...
- 4.python迭代器生成器装饰器
容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元素存储在内存中 ...
- iOS 获取一个不变的UDID
原文:iOS7: 如何获取不变的UDID 如何使用KeyChain保存和获取UDID 本文是iOS7系列文章第一篇文章,主要介绍使用KeyChain保存和获取APP数据,解决iOS7上获取不变UDID ...
- ABP PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词) 引发客户端错误 No 'Access-Control-Allow-Origin' header is present on the requested resource
先请检查是否是跨域配置问题,请参考博客:http://www.cnblogs.com/donaldtdz/p/7882225.html 一.问题描述 ABP angular前端部署后,查询,新增都没问 ...
- SDP(0):Streaming-Data-Processor - Data Processing with Akka-Stream
再有两天就进入2018了,想想还是要准备一下明年的工作方向.回想当初开始学习函数式编程时的主要目的是想设计一套标准API給那些习惯了OOP方式开发商业应用软件的程序员们,使他们能用一种接近传统数据库软 ...
- Selenide UI 自动化测试
我没有拼写错误,确实不是 Selenium ,但是,只要是 Web UI 自动化测试框架,基本上都是基于Selenium 的.Selenide 也不例外.那为啥不直接用Selenium呢? 因为 ...
- Design Patterns笔记
一些笔记. strategy : facilitates the switch of the different but related algorithms/behaviors observer p ...