【问题标题】:How to fix "ERROR 1118 (42000): Row size too large (> 8126)" with MariaDB 5.5?如何使用 MariaDB 5.5 修复“ERROR 1118 (42000): Row size too large (> 8126)”?
【发布时间】:2019-04-02 21:09:43
【问题描述】:

我正在将一个包含 314 列的 CSV 文件上传到 MariaDB 5.5 服务器。目前我的代码如下所示:

CREATE TABLE table_name
   (column_1 TEXT,
    column_2 TEXT,
    ...
    column_314 TEXT)
ROW_FORMAT=DYNAMIC;
LOAD DATA LOCAL INFILE filepath  
INTO TABLE table_name 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS;

这会导致以下错误:

ERROR 1118 (42000): 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.

我正在使用 Barracuda InnoDB 文件格式并启用了每表文件:

innodb_file_format=Barracuda
innodb_file_per_table=1

我认为问题在于 innodb 页面大小,设置为 16k。因为我使用的是 MariaDB 5.5 而不是 10.1+,所以我也不相信有办法增加页面大小。该数据库由组织管理,目前无法升级到较新版本。

【问题讨论】:

  • 因为 MariaDB 和 MySQL 在这种情况下都使用相同的数据库结构(innoDB),所以 MySQL 的答案也几乎肯定是 MariaDB 的相同方法。请看this answer
  • 请确认您已阅读并尝试过这些解决方案并说明如果此处的答案 (t)回答您的问题

标签: mysql sql mariadb innodb


【解决方案1】:

314 列“太多”。但是,由于将其拆分为 CSV 文件相当麻烦,以下是一些关于 可能 帮助您加载这么多列的想法:

  • 一定要使用最小大小的整数:TINYINT UNSIGNED 只有 1 个字节并且允许数字 0..255。其他尺寸请参见手册。
  • 一定要使用最小尺寸的VARCHARs:不要简单地说VARCHAR(255)。如果您投篮不足,您会被截断,因此可能需要通过几次才能确定最佳尺寸。
  • 使用CHARACTER SET latin1 表示您知道只是英语,甚至是西欧的任何列。如有必要,请使用 utf8utf8mb4
  • 除非必要,否则请避免使用TEXTBLOB

向我们展示数据样本;我们可能会有更多提示。

(您可以将 16KB 的限制提高到 64KB,但这将永远改变所有表的限制。几乎没有人这样做。我不知道有什么危险,如果有的话。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 2013-12-19
    • 2019-01-12
    • 1970-01-01
    • 2022-01-04
    • 2014-09-29
    • 2018-09-16
    • 2015-12-26
    相关资源
    最近更新 更多