【问题标题】:Load data infile (from csv): data too long for column 'xxx' at row N加载数据文件(来自 csv):第 N 行的列“xxx”的数据太长
【发布时间】:2016-10-05 09:47:22
【问题描述】:

我正在将 .csv 导入 Mysql,如下所示:

LOAD DATA INFILE '(...)/contact_acquisition.csv'
INTO TABLE rs_ui_db.contact_acquisition
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;  

...抛出以下错误:

"第 63 行的列 'cmets' 的数据太长"

我查看 .csv 的第 63 行,“cmets”的长度为 115。

create 语句似乎没问题(使用comments char(255)):

CREATE DATABASE IF NOT EXISTS `my_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `my_db`;

DROP TABLE IF EXISTS `contact_acquisition`;
CREATE TABLE `contact_acquisition` (
  `SID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `pilot` char(255) NOT NULL,
  `contact` char(255) NOT NULL,
  `email` char(255) NOT NULL,
  `tel` char(255) NOT NULL,
  `comments` char(255) NOT NULL,
  PRIMARY KEY (`SID`)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8; 

在标记为重复之前,请注意:

This StackOverflow 解决方案显然不适合:我已经将CHARACTER SET utf8 添加到LOAD DATA sql。

This 其他 StackOverflow 解决方案对我来说似乎有点牵强,因为我插入的所有数据(创建数据库语句、创建表语句、CSV 等)都是从另一台服务器提取的其中允许完全相同的行。我使用 Mysql Workbench 来提取创建/csv 等。

我正在尝试从一台服务器自动导出到另一台服务器,因此更改目标中的数据类型对我来说不是一个选项。


更新

这是行(经过混淆处理,但保留非字母数字字符):

64,xxxx xxxx,"xxxx xxxx, xxxx xxxx","xxxx.xxxx@xxxx.xxxx, xxxx.xxxx@xxxx-xxxx.xxxx.xxxx",xxxx (xxxx) xxxx xxxx xxxx xxxx xxxx (xxxx),"xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx xxxx xxxx, xxxx xxxx xxxx'xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx"

MySQL 抱怨的部分是:"xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx xxxx xxxx, xxxx xxxx xxxx'xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx"。由"包裹,包含1个逗号和3个'。正确导入的其他行(来自同一 CSV)也具有这些字符。长度似乎是与其他行的唯一区别。

csv 文件是 utf8 格式。

【问题讨论】:

  • 您是否检查过数据中的杂散逗号或换行符是否会影响 MySQL 导入数据的方式?
  • @Shadow 这是行(经过混淆处理,但保留非字母数字字符)64,xxxx xxxx,"xxxx xxxx, xxxx xxxx","xxxx.xxxx@xxxx.xxxx, xxxx.xxxx@xxxx-xxxx.xxxx.xxxx",xxxx (xxxx) xxxx xxxx xxxx xxxx xxxx (xxxx),"xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx xxxx xxxx, xxxx xxxx xxxx'xxxx xxxx xxxx'xxxx xxxx xxxx xxxx xxxx"\r\n。逗号或换行符似乎设置正确。我在更新部分添加了更多信息。
  • comments 设置为更高的字符长度,导入,然后查看MySQL 在此记录中为该列返回的长度...?
  • MySQL 可能将其解释为行尾的字符(如换页)呢?换页不是可见字符。此外,错误消息提到第 63 行,但数据似乎来自第 64 行(SID 可能不同,但谁知道)。
  • @Shadow id 与行号的差异是由于标题 (IGNORE 1 ROWS)。

标签: mysql csv


【解决方案1】:

尝试使用 LINES TERMINATED BY '\r\n'

LOAD DATA INFILE '(...)/contact_acquisition.csv'
INTO TABLE rs_ui_db.contact_acquisition
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;

这对我来说非常适合

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 2014-02-26
    • 2018-10-19
    • 2022-11-26
    • 2020-01-07
    • 2020-03-04
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多