首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL错误1118行尺寸过大(> 8126)

MySQL错误1118行尺寸过大(> 8126)
EN

Stack Overflow用户
提问于 2015-11-20 14:31:45
回答 1查看 3.7K关注 0票数 0

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

这个问题的神秘之处在于,它取决于“完整”的陈述。如果我删除一行中的一个字符(不管是哪一行),语句就会工作。如果我添加了一个字符(不管是哪一行),我就会收到1118错误。

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

限制在哪里?

我可以运行以下命令,但是Varchar(1)的3个变量正在被裁剪。如果我将Varchar更改为text,则会收到错误。

由于堆栈溢出字符的限制,我在这里上传了我的声明:http://pastie.org/private/yriegkyurqavnqezzbsqta

在“”之间,您可以填充大约12569个随机字符,无论您在哪里填写它们,在12570之后,我收到了错误。

代码语言:javascript
复制
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:

代码语言:javascript
复制
[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个字符的语句?

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 19:48:39

使用create和pastie url的insert语句(删除了db名称引用)

这就是我得到的

错误1406:数据太长以致于列Icecat_Eigenschaft_Wert_presentation

这是一个varchar(1000)

修复它,然后转到下一个错误消息(大概)。把它修好。冲洗并重复。

我只是得到了一个不同的错误信息,如上文所示。

运行mysql 5.6.24。

见手册页InnoDB表的极限

虽然InnoDB在内部支持大于65,535字节的行大小,但MySQL本身对所有列的合并大小施加了65,535行大小的限制:

代码语言:javascript
复制
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字节。LONGBLOB和LONGTEXT列必须小于4GB,总行长度(包括BLOB和TEXT列)必须小于4GB。 如果一行的长度小于半页,则所有行都在本地存储在该页中。如果超过半页,则选择可变长度列作为外部页外存储,直到行符合半页,如14.12.2节“文件空间管理”所述。 为外部页外存储选择的BLOB列的行大小不应超过合并重做日志文件大小的10%。如果行大小超过合并重做日志文件大小的10%,InnoDB可能会覆盖最近的检查点,这可能导致崩溃恢复期间丢失数据。(Bug#69477)。

因此,当您达到某个阈值时,开始转换为TEXT数据类型等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33829204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档