(仅作记录,下面的解决步骤我试了一下还是会报同样的错误,问题没有解决,只好把varchar类型的大小挨个的改小了一点。若是哪位大神调好了,还请指点一二。)

解决步骤

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

例:

SET GLOBAL innodb_file_format='Barracuda';
SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS `cdfd`;
CREATE TABLE `cdfd` (`Title_ZH` varchar(255) DEFAULT NULL COMMENT '中文题名',`Title_EN` varchar(255) DEFAULT NULL COMMENT '英文题名',`FileName` char(24) DEFAULT NULL COMMENT '文件名',......  ............  ......<pre name="code" class="sql">  `Author_Code` varchar(255) DEFAULT NULL,`Unit_Code` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

参考:(1)http://www.cnblogs.com/gaizai/archive/2012/09/20/2695663.html

(2)http://blog.csdn.net/arbel/article/details/8042050

(3)http://www.cnblogs.com/billyxp/p/3342969.html

一、背景

我们的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=utf8ROW_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技术内幕InnoDB存储引擎》

Exploring New Features in InnoDB Plugin-1.0

Issue with maximum row size in MySQL

max-allowed-packet

Innodb row size limitation

Mysql的row_format

mysql 5.1 innodb plugin压缩测试

MySQL字段类型详解

MySQL TEXT数据类型的最大长度

Mysql 出现Error 1118 Row size too large. The maximum row size is 65535 的解决办法相关推荐

  1. MySQL新增字段报错:ERROR 1118 -- Row size too large. The maximum row size for the used table type

    MySQL新增字段报错:ERROR 1118 – Row size too large. The maximum row size for the used table type, not count ...

  2. Cannot create table [data_source]: 1118 - Row size too large. The maximum row size for the used tabl

    1.问题 在导入mysql数据库时,报错: Cannot create table [data_source]: 1118 - Row size too large. The maximum row ...

  3. mysql text 最大长度 报错 Row size too large. The maximum row size for the used table type

    数据类型长度如下 TINYTEXT 256 bytes   TEXT 65,535 bytes ~64kb MEDIUMTEXT  16,777,215 bytes ~16MB LONGTEXT 4, ...

  4. oracle ||#039; where #039;||condition;,帝国cms后台添加字段提示#039;Row size too large. The maximum row size...

    今天在帝国cms后台创建系统模型,添加字段时报了一个错误,ERROR 1118 (42000): Row size too large. The maximum row size for the us ...

  5. MySQL【问题记录 01】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法

    1.问题重现 CREATE TABLE `xxl_job_registry` (`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varcha ...

  6. 1709 - Index column size too large. The maximum column size is 767 bytes.

    1,mysql导入同事发的sql文件报如下错误:1709 - Index column size too large. The maximum column size is 767 bytes. 2, ...

  7. ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

    MySQL版本5.6.35 在一个长度为512字符的字段上创建unique key报错 CREATE DATABASE dpcs_metadata DEFAULT CHARACTER SET utf8 ...

  8. Mysql 出现Error 1118的一种解决方法

    首先声明,对mysql不懂,很多都不知道原因 设计了一个表,里面很多text字段,然后填进去的东西太多(用的是python的MySQLdb),报错: _mysql_exceptions.Operati ...

  9. “fatal error C1014:包含文件太多:深度 = 1024”的原因与解决办法

    在定义变量,或文件名时,议定不要和系统关键字重名,否则容易引起错误. 错误信息:     fatal error C1014:包含文件太多:深度 = 1024 原因分析与解决办法: 1.可能是两个或多 ...

最新文章

  1. 目标管理和任务协作,用智办事更方便
  2. ts watch路由 参数变化_vue watch 监听路由变化
  3. How to find documentation of given API
  4. 狭义上讲侠义计算机安全,狭义的会计电算化是什么
  5. 这七种回归分析技术,学了不后悔~
  6. python列表数据类型-入门学习
  7. 【Kalman】卡尔曼滤波器工作原理(Link)
  8. 如何使用Putty登录安装在VirtualBox里的ubuntu 1
  9. Android开发工具集合
  10. 一些可视化Javascript插件
  11. 电商网站项目总结(面向对象编程篇)
  12. 字符串匹配算法KMP详解
  13. python处理xps文件_如何在Windows 10系统中处理XPS文件
  14. 人工智能就是计算机科学的英文,AI(人工智能)的英文全称?AI指什么,包含什么?
  15. 计算机在流体力学中的应用,哈尔滨工业大学-工程流体力学课程
  16. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  17. ecshop分类间隔变色_JS小案例:循环间隔重复变色
  18. K.论演员的自我修养---组合数的运用路径计数
  19. c#后台如何导出excel到本地_C#实现导出Excel
  20. Mac 电脑添加代理服务器

热门文章

  1. 程序员,请昂起你高贵的头
  2. 动态设置input设置只读属性
  3. EMNLP-21-TEBNER: Domain Specific Named Entity Recognition with Type Expanded Boundary-aware Network
  4. 感恩有你,我们大会见?
  5. ADV-168贪吃的大嘴
  6. uni-app 小程序文件下载并分享
  7. UE4如何将虚幻商城资源导入到自己的工程中+保管库的使用
  8. Activiti5学习笔记(二)
  9. arduino数字端口输出电压可驱动多大继电器呢_arduino传感器专辑之火焰(红外线)传感器模块...
  10. Qt快速读取Excel文件