在创建数据库表时报错
之前已经在数据库里创建了多张表,但在创建其中一张数据库表时报如下错:
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
Query OK, 0 rows affected (0.00 sec)
原因分析
这篇文章说得比较清楚: 链接。
简单来说,就是在InnoDB引擎下创建表时行格式无法存储它,可能有以下原因:
- 在 strict mode 模式启用后,DDL 语句被执行时影响了表,如 CREATE TABLE or ALTER TABLE 操作,这时会抛出Error信息。
- 在 strict mode 模式被禁用后,DDL 语句被执行时影响了表,如 CREATE TABLE or ALTER TABLE 操作,这时会抛出Warning信息。
- 不管strict mode 模式是否启用,DML语句被被执行写入一行时,InnoDB引擎行无法存储它时,会抛出这个Error信息。
我发现是第三种情况,因为网上很多人说是要设置下 strict mode 模式进行解决,我发现解决不了。
根本原因
在InnoDB引擎下,存在最大的row size的限制,它的限制大约是 innodb_page_size 这个系统变量的一半。详情。
但不同的row format其具体值也会不一样,其中 DYNAMIC 和COMPRESSED row size是最大的。在做row format时,有以下几种模式:
- REDUNDANT (MySQL 4.1 之前默认采用的方式)
- COMPACT (MariaDB [10.1~10.2.1] 和 MySQL 5.6 之前默认采用的方式)
- DYNAMIC (MariaDB >= 10.2.2 默认采用的方式)
- COMPRESSED
四种不同的格式详情可参考:
https://mariadb.com/kb/en/innodb-row-formats-overview
解决方法
将表的row format改成 DYNAMIC 或者 COMPRESSED 可解决