MySQL:错误代码:1118行大小太大(> 8126).将某些列更改为TEXT或BLOB

Die*_*o87 50 mysql sql create-table

我想创建一个325列的表:

CREATE TABLE NAMESCHEMA.NAMETABLE 
(   
      ROW_ID TEXT NOT NULL ,        //this is the primary key

324 column of these types:
      CHAR(1), 
      DATE, 
      DECIMAL(10,0), 
      DECIMAL(10,7), 
      TEXT, 
      LONG,

) ROW_FORMAT=COMPRESSED;
Run Code Online (Sandbox Code Playgroud)

我用TEXT替换了所有VARCHAR,我在MySQL的my.ini文件中添加了Barracuda,这是添加的属性:

innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_file_format_check = ON
Run Code Online (Sandbox Code Playgroud)

但我仍然有这个错误:

Error Code: 1118
 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Run Code Online (Sandbox Code Playgroud)

编辑:我无法更改数据库的结构,因为它是遗留的应用程序/系统/数据库.创建一个新表,它是遗留数据库的导出.

编辑2:我写的这个问题与其他人类似,但内部有一些我在互联网上找到的解决方案,如VARCHAR和Barracuda,但我仍然有这个问题所以我决定打开一个新的问题已经内部的经典答案,看看是否有人有其他答案

小智 50

由于MySQL Server 5.6.20的更改,我最近遇到了相同的错误代码.我能够通过更改my.ini文本文件中的innodb_log_file_size来解决问题.

在发行说明中,解释了innodb_log_file_size太小会触发"行大小太大的错误".

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html

  • 我在"my.ini"中使用了这个设置,而不是它对我有用.innodb_log_file_size = 500M innodb_log_buffer_size = 800M (7认同)
  • 更改 innodb_log_file_size 还不够,请将 innodb_strict_mode = 0 添加到您的答案中:) (4认同)
  • @ KingAlex1985你确定innodb_log_buffer_size可以设置为如此高的值吗?默认设置是4M,文档说"因为它每秒刷新一次,所以它非常大(即使是长事务)也没有意义".还有另一个选项innodb_buffer_pool_size(看起来类似)800M可能更有意义(docs:"你设置的越大,访问表中数据所需的磁盘I/O越少"). (3认同)
  • @KingAlex1985顺便说一句,文档说,“由于 MySQL 5.6 引入了重做日志 BLOB 写入限制,innodb_log_file_size 设置应该比表行中找到的最大 BLOB 数据大小加上长度的 10 倍大。其他可变长度字段(VARCHAR、VARBINARY 和 TEXT 类型字段)。您可能不需要像以前那样增加它们。 (2认同)
  • 确认这个答案在 2020 年不再完全有效。看看 Stefano 的。 (2认同)

小智 49

我在这里尝试了所有解决方案,但只有这个参数

innodb_strict_mode             = 0
Run Code Online (Sandbox Code Playgroud)

解决了我的一天......

从手册:

innodb_strict_mode设置会影响CREATE TABLE,ALTER TABLE和CREATE INDEX语句的语法错误处理.innodb_strict_mode还启用记录大小检查,以便INSERT或UPDATE永远不会因为记录对于所选页面大小而言太大而失败.

  • 无需重新启动服务器设置“SET GLOBAL innodb_strict_mode = 0;”和“SET innodb_strict_mode = 0;”对我有用 (11认同)
  • 当然,这实际上并没有解决问题.您只是关闭验证以检查记录大小. (7认同)
  • 感谢您的解决方案!你救了我的一天!我正在使用 symfony 3 项目中的学说 2,其中我们有大约 200 列,并且在生成实体时出现此错误。 (2认同)
  • 禁用支票不是解决方案 (2认同)
  • 呃,我想投票,因为这可行,但我不完全确定我对这个解决方案感到满意。 (2认同)

小智 27

ERROR 1118 (42000) at line 1852:    
Row size too large (> 8126). Changing some columns to TEXT or 
     BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
Run Code Online (Sandbox Code Playgroud)
[mysqld]

innodb_log_file_size = 512M

innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)

ubuntu 16.04编辑路径:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)

在MS Windows上,路径将是这样的:

C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
Run Code Online (Sandbox Code Playgroud)

不要忘记重新启动服务(或重启机器)

  • 如果我将 `innodb_log_file_size = 512M` 添加到我的配置文件中,MySQL 将无法重新启动。 (2认同)

Nan*_*mar 17

如果启用了 InnoDB 严格模式,则会显示此错误。

检查是否启用

SHOW  variables LIKE '%strict%';
Run Code Online (Sandbox Code Playgroud)

如果启用则可以禁用。

SET GLOBAL innodb_strict_mode=OFF;
Run Code Online (Sandbox Code Playgroud)

欲了解更多详细信息,请阅读此处>>


Sta*_*tar 16

今天早上有类似的问题,以下方法救了我的命:

你试过关掉innodb_strict_mode吗?

SET GLOBAL innodb_strict_mode = 0;
Run Code Online (Sandbox Code Playgroud)

然后再次尝试导入。

innodb_strict_mode 在关闭之前,使用 MySQL >= 5.7.7 打开。


Fra*_*zCC 13

对于 MariaDB 用户(版本 >= 10.2.2)和 MySQL(版本 >= 5.7),简单的解决方案是:

ALTER TABLE `table` ROW_FORMAT=DYNAMIC;
Run Code Online (Sandbox Code Playgroud)


KFo*_*bar 9

在 MacOS 上(使用 Brew)将 SQL 转储(从 MySQL 8)导入到 MariaDB 时遇到了问题。

首先编辑您的my.cnf.
如果您使用 Brew,它通常存储在/usr/local/etc/

pico /usr/local/etc/my.cnf
Run Code Online (Sandbox Code Playgroud)

将此添加到配置中:

[mysqld]
innodb_log_file_size = 1024M
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)

然后重启 MariaDB:

brew services restart mariadb
Run Code Online (Sandbox Code Playgroud)

请注意,这是一种解决方法,而不是修复方法,因为在不解决问题的情况下切换了严格模式,但由于它是我的本地环境而不是生产环境,因此我对此没有意见。


小智 8

关键参数是:innodb_page_size

MySQL 5.7中增加了对32k和64k页面大小的支持。对于32k和64k页面大小,最大行长度约为16000字节。

诀窍在于,只能在 mysql服务实例的INITIALIZATION期间更改此参数,因此,如果在实例已初始化实例的第一次运行)后更改此参数则它不会有任何影响

只能在初始化MySQL实例之前配置innodb_page_size,此后不能更改。如果未指定任何值,则使用默认页面大小初始化实例。请参见第14.6.1节“ InnoDB启动配置”。

因此,如果不在初始化前在my.ini中更改此值,则默认值为16K,行大小限制为〜8K。这就是为什么出现错误。

如果增加innodb_page_size,则也必须增加innodb_log_buffer_size将其设置为至少16M。同样,如果ROW_FORMAT设置为COMPRESSED,则不能将innodb_page_size增加到32k或64K。它应该是动态的(5.7中的默认值)。

当innodb_page_size设置为32KB或64KB时,不支持ROW_FORMAT = COMPRESSED。对于innodb_page_size = 32k,扩展区大小为2MB。对于innodb_page_size = 64k,扩展区大小为4MB。使用32k或64k页面大小时,应将innodb_log_buffer_size设置为至少16M(默认值)。

此外,应将innodb_buffer_pool_size至少从128M增加到512M否则您将在实例初始化时收到错误消息(我没有确切的错误)。

此后,行大小错误消失了。

问题是您必须创建一个新的MySql实例,并将数据从旧实例迁移到新的DataBase实例。

我更改并工作的参数(在创建新实例并使用首先使用这些设置修改的my.ini初始化之后):

innodb_page_size=64k
innodb_log_buffer_size=32M
innodb_buffer_pool_size=512M
Run Code Online (Sandbox Code Playgroud)

我在其中找到解决方案的所有设置和说明都可以在这里找到:

https://dev.mysql.com/doc/refman/5.7/zh-CN/innodb-parameters.html

希望这可以帮助!

问候!

  • 我合理地回答了一堆q,所以我可以获得足够的声誉来发表评论-谢谢您的修复。对于尝试此方法的其他人:我遇到一个问题,即在完成MySQL安装后,服务器将自动启动(使用默认的innodb参数初始化数据库,从而阻止了此修复程序)。我解决这个问题的方法是在安装MySQL之前放置“ my.ini / my.conf”配置文件(带有@fefe的innodb值)。再次感谢您,绝对的传奇。 (2认同)

小智 7

我最近创建了一个包含82列的表,并且与InnoDB有相同的错误.为了绕过这个问题,我们将表格格式转换MyISAM为刚用于基本表格的格式.


Kar*_*arl 7

更改为 MyISAM 不是解决方案。对于 innodb 以下为我工作。

在 my.cnf 上设置以下内容

innodb_strict_mode=0
Run Code Online (Sandbox Code Playgroud)


imb*_*ond 6

对于 Mac OS X El Capitan 上的 MySQL 5.7:

OS X 在 /usr/local/mysql/support-files/my-default.cnf 提供示例配置文件

要添加变量,首先停止服务器并将上面的文件复制到,/usr/local/mysql/etc/my.cnf

cmd : sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf
Run Code Online (Sandbox Code Playgroud)

注意:如果它不存在,请在“mysql”下创建“etc”文件夹。

cmd : sudo mkdir /usr/local/mysql/etc
Run Code Online (Sandbox Code Playgroud)

一旦 my.cnf 在 etc. 下创建,就该在其中设置变量了。

cmd: sudo nano my.cnf
Run Code Online (Sandbox Code Playgroud)

在 [mysqld] 下面设置变量

[mysqld]
innodb_log_file_size = 512M
innodb_strict_mode = 0
Run Code Online (Sandbox Code Playgroud)

现在启动一个服务器!


小智 6

我只是想为其他一些人提供帮助,解决这个问题的更严重的变体。在某些情况下,即使使用“alter table drop columns”和“alter table修改列”语句,也会出现错误(“行大小太大..将某些列更改为TEXT或BLOB”)!

因此,您可能会完全陷入困境,无法将 varchar 更改为文本,或删除列(讽刺的是,尝试解决问题会导致相同的消息)。

如果您遇到此问题,解决方案是一次更改或删除多个列。您可以在 MySQL 中使用语法“alter table example drop column a, drop column b, drop column c”来执行此操作,如果您一次删除足够多的列,它实际上会执行而不是引发错误。


Gor*_*off 5

MySQL 非常清楚它的最大行大小:

每个表(无论存储引擎如何)的最大行大小为 65,535 字节。存储引擎可能会对此限制设置额外的约束,从而减少有效的最大行大小。

. . .

单个存储引擎可能会施加额外的限制来限制表列数。例子:

InnoDB 最多允许 1000 列。

InnoDB 将行大小限制为小于数据库页面的一半(大约 8000 字节),不包括 VARBINARY、VARCHAR、BLOB 或 TEXT 列。

不同的 InnoDB 存储格式(COMPRESSED、REDUNDANT)使用不同数量的页头和尾部数据,这会影响行可用的存储量。

如果您有 325 组重复的列,则超出了几个限制。这也是一种可疑的数据格式。表格中的每一行应该有 325 行,每组列一个。

  • @用户3410465。. . 你必须。数据库不支持您尝试执行的操作。您可以使用不同的数据库,但仍然有数百个重复的列块似乎是个坏主意。 (3认同)

小智 5

innodb_log_file_size=512M

innodb_strict_mode=0
Run Code Online (Sandbox Code Playgroud)

这两行在 mysql 配置中对我有用!

  • Jose,您应该始终在 stackoverflow.com 上用英语回答。如果您喜欢用西班牙语进行协作,可以使用 [stackoverflow en español](https://es.stackoverflow.com/) (2认同)