【问题标题】:MySQL error 1118 Row size too large (> 8126)MySQL 错误 1118 行大小太大 (> 8126)
【发布时间】:2016-02-23 02:09:08
【问题描述】:

我的 MySQL 数据库有问题。我想运行一个巨大的插入/重复语句并收到 1118 错误。

这个问题的神秘之处在于,它依赖于“完整”的陈述。如果我删除一行上的一个字符(无论哪一行),该语句都会起作用。如果我添加一个字符(无论哪一行),我都会收到 1118 错误。

我尝试增加 my.ini 上的许多值,例如innodb_log_file_size、innodb_buffer_pool_size 和 innodb_log_buffer_size。没有什么对我有用。

限制在哪里?

我可以运行以下命令,但是 Varchar(1) 的 3 个变量正在被删除。如果我将 Varchar 更改为文本,我会收到错误消息。

由于 Stackoverflow 字符限制,我在此处上传了我的声明:http://pastie.org/private/yriegkyurqavnqezzbsqta

在 '' 之间你可以填充大约 12569 个随机字符,不管你在哪里填充它们,在 12570 之后我收到错误。

This is the create table code:
CREATE TABLE `produktliste_icecat` (
`EAN` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Fehler` VARCHAR(200) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Bild_high` VARCHAR(250) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Bild_low` VARCHAR(250) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Bild_thumb` VARCHAR(250) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Name` VARCHAR(200) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Titel` VARCHAR(200) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Quality` VARCHAR(50) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Anleitung` VARCHAR(100) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Datenblatt` VARCHAR(100) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_URL` VARCHAR(500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Garantie` VARCHAR(2500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Beschreibung_kurz` VARCHAR(700) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Beschreibung_lang` TEXT NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Zusammenfassung_kurz` VARCHAR(700) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Zusammenfassung_lang` VARCHAR(1500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Titel` VARCHAR(1500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Name` VARCHAR(1) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Wert` VARCHAR(1) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Kategorie_Zuordner` VARCHAR(1) NOT NULL COLLATE 'utf8_general_ci',
`Icecat_Eigenschaft_Titel_ID` VARCHAR(700) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_alternative_EAN` VARCHAR(2500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Wert_presentation` TEXT NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Wert_local` TEXT NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Kategorie` VARCHAR(100) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Kategorie_Eigenschaft_suchbar` VARCHAR(2500) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Titel_Prio` VARCHAR(3300) NOT NULL COLLATE 'utf8_unicode_ci',
`Icecat_Eigenschaft_Wert_Prio` VARCHAR(700) NOT NULL COLLATE 'utf8_unicode_ci',
UNIQUE INDEX `EAN` (`EAN`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB;

这是我的 my.ini:

[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "Z:/xampp_sql/data"
pid_file = "mysql.pid"
key_buffer = 1G
max_allowed_packet = 500M
sort_buffer_size = 4M
net_buffer_length = 4M
read_buffer_size = 50M
read_rnd_buffer_size = 1024K
myisam_sort_buffer_size = 8M
log_error = "mysql_error.log"
innodb_buffer_pool_size = 1G
query_cache_type = 1
innodb_log_file_size = 20000M
innodb_log_buffer_size=1250M
innodb_flush_log_at_trx_commit=2
innodb_thread_concurrency=0
innodb_file_per_table

bind-address="0.0.0.0" 
plugin_dir = "C:/xampp/mysql/lib/plugin/" 
skip-federated
server-id   = 1
innodb_data_home_dir = "C:/xampp/mysql/data"
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = "C:/xampp/mysql/data"
innodb_additional_mem_pool_size = 2M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

有谁知道如何在语句中运行超过 12570 个字符的语句?

提前谢谢你!

【问题讨论】:

标签: mysql size row


【解决方案1】:

使用您的创建表和粘贴 url 中的插入语句(已删除数据库名称引用)

这就是我得到的

错误 1406:列的数据太长 Icecat_Eigenschaft_Wert_presentation

这是一个varchar(1000)

修复该问题并继续处理下一条错误消息(大概)。修复它。冲洗并重复。

我只是收到了一条不同的错误消息,如上所示。

运行 mysql 5.6.24。

参见手册页Limits on InnoDB Tables:

尽管 InnoDB 支持大于 65,535 字节的行大小 在内部,MySQL 本身将行大小限制为 65,535 所有列的总大小:

mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs

虽然查看您的创作,但目前这似乎不是问题。但要记住一些事情。怎么解决?也许下面,也来自该手册页:

最大行长度,除了可变长度列(VARBINARY, VARCHAR、BLOB 和 TEXT),略小于数据库的一半 页。也就是说,最大行长度约为 8000 字节。长块 和 LONGTEXT 列必须小于 4GB,总行长, 包括 BLOB 和 TEXT 列,必须小于 4GB。

如果一行小于半页长,则全部存储在本地 页面内。如果超过半页,可变长度列 被选为外部页外存储,直到行适合 半页,如第 14.12.2 节“文件空间管理”中所述。

为外部离页选择的 BLOB 列的行大小 存储不应超过组合重做日志文件大小的 10%。如果 行大小超过组合重做日志文件大小的 10%,InnoDB 可能会覆盖最近的检查点,这可能会导致丢失 崩溃恢复期间的数据。 (错误#69477)。

所以当你达到某个阈值时,开始转换为TEXT 数据类型等。

【讨论】:

  • 您好 Drew,感谢您的详细回答。我已经用更新的 my.ini 编辑了我的问题并创建了代码。问题不在于 Varchars,该语句使用 varchars 运行,因为所有长值都被截断了。如果我将 varchars 更改为文本,我会得到一个错误。您能否运行我的新创建代码并将 Varchar(1) 值之一更改为文本?那么你应该得到我的错误。在我的 mysql 工具上,长值正在被削减,没有任何通知或警告。提前谢谢你
  • 我将尝试一些迭代的更改。这里的第一个是使用您从编辑中创建的新创建,然后运行插入,我得到 错误 1406: Data too long for column Icecat_Kategorie_Zuordner
  • 下一次迭代,如果我将您的 3 varchar(1) 更改为 text,我会收到错误 1118 Row size too large (>8126)
  • 因为我不会对我的服务器执行此操作,所以我将其留给您进行调查。祝你好运
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2014-05-03
  • 2019-05-17
  • 2014-09-13
  • 2014-12-31
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多