MySQL多Text字段报8126错误(解决过程)
来源:互联网 发布:多益网络手机游戏 编辑:程序博客网 时间:2024/05/22 02:21
一、背景
我们的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错误(解决过程)
- MySQL多Text字段报8126错误(解决过程)
- mysql Blob和Text字段过程错误
- elasticsearch text字段排序报错解决
- windows MySQL报"2006 - MySQL server has gone away"错误,解决过程.
- LoadRunner的-26612报错解决过程(关联错误)
- windows MySQL 报“Got a packet bigger than 'max_allowed_packet' bytes”错误,解决过程.
- MySQL启动报【The server quit without updating PID file】错误的解决过程
- windows MySQL 报“Got a packet bigger than 'max_allowed_packet' bytes”错误,解决过程.
- 解决Mysql存入大量TEXT类型的数据报错
- mysql报ERROR 2003错误的解决
- 解决mysql 报1044错误的问题
- mysql安装报错系统发生错误 2;MySQL服务无法启动 服务没报任何错误(已解决)
- mysql 存储过程相关错误解决
- oracle迁移到mysql时insert数据到mysql text字段发现报字段不够长的问题
- mysql的text字段长度
- mysql text 字段过多解决方法
- LoadRunner的-26612报错解决过程(参数化错误)
- PHP中PDO的基础使用实例
- 浅谈JavaFX事件机制
- Ubuntu10下MySQL搭建Master Slave
- 【sublime】在sublime中创建tab快速代码块
- JavaFX 3D部分介绍(4) Materials
- MySQL多Text字段报8126错误(解决过程)
- NSString批量替换字符串
- nodejs中exports与module.exports的区别详细介绍
- 认识 Atlassian Datacenter 产品
- iOS-浅谈runtime运行时机制-类与对象的内部结构
- Windows下安装MySQL最佳实践
- JavaFX 3D部分介绍(3) Lights
- LeetCode 202:Happy Number
- 相机校正(实现)