【问题标题】:MySQL Error Code: 1262. Row x was truncated; it contained more data than there were input columnsMySQL 错误代码:1262。第 x 行被截断;它包含的数据多于输入列
【发布时间】:2018-08-12 09:15:30
【问题描述】:

我需要将文件内容加载到表格中。该文件包含用逗号分隔的文本。这是一个非常大的文件。我不能像这样更改已经给我的文件。

12.com,128.15.8.6,TEXT1,no1,['128.15.8.6']
23com,122.14.10.7,TEXT2,no2,['122.14.10.7']
45.com,91.33.10.4,TEXT3,no3,['91.33.10.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8', '5.112.1.10']

我需要将文件加载到一个四列的表中。因此,例如,上面的最后一行应该在表格中如下:

table.col1: 67.com

table.col2: 88.22.88.8

table.col3: TEXT3

table.col4: no3

table.col5: ['88.22.88.8', '5.112.1.10']

使用 MySQL 工作台,我创建了一个包含五列的表,所有列的类型均为 varchar。然后我运行以下 SQL 命令:

LOAD DATA INFILE '/var/lib/mysql-files/myfile.txt'
  INTO TABLE `mytable`.`myscheme`
  fields terminated BY ','

最后一列字符串(其中包含我不想分隔的逗号)会导致问题。

Error:
Error Code: 1262. Row 4 was truncated; it contained more data than there were input columns

请问我该如何解决这个问题。

【问题讨论】:

  • 延长列的长度
  • 文件中括号之间的字符串数量不可预测。我发布的是一个示例,但括号内的字符串数量不同。出于多种原因,我想将它们视为单个列。此字段的多列不适合我的情况。
  • 您使用逗号分隔列,因此这些“括号之间的字符串数量不可预测”会产生导入错误.. 有一些技巧可以避免这种情况.. 但不仅仅是基于加载数据命令。 .
  • @scaisEdge 谢谢。即使与加载命令无关,您也可以发布任何可以提供帮助的技巧。
  • @user9371654 ..我已经发布了一个我在类似情况下使用的技巧的aswer ..

标签: mysql sql database database-design datatable


【解决方案1】:

简单地使用加载数据 infile 并没有那么困难 - 请注意变量的使用。

 drop table if exists t;
create table t(col1 varchar(20),col2 varchar(20), col3 varchar(20), col4 varchar(20),col5 varchar(100));

truncate table t;

load data infile 'test.csv' into table t LINES TERMINATED BY '\r\n' (@var1)

    set col1 = substring_index(@var1,',',1),
    col2 = substring_index(substring_index(@var1,',',2),',',-1),
    col3 = substring_index(substring_index(@var1,',',3),',',-1),
    col4 = substring_index(substring_index(@var1,',',4),',',-1),
    col5 = concat('[',(substring_index(@var1,'[',-1)))

;

select * from t;
    +--------+-------------+-------+------+------------------------------+
| col1   | col2        | col3  | col4 | col5                         |
+--------+-------------+-------+------+------------------------------+
| 12.com | 128.15.8.6  | TEXT1 | no1  | ['128.15.8.6']               |
| 23com  | 122.14.10.7 | TEXT2 | no2  | ['122.14.10.7']              |
| 45.com | 91.33.10.4  | TEXT3 | no3  | ['91.33.10.4']               |
| 67.com | 88.22.88.8  | TEXT4 | no4  | ['88.22.88.8', '5.112.1.10'] |
+--------+-------------+-------+------+------------------------------+
4 rows in set (0.00 sec)

【讨论】:

  • 你能解释一下(@var1)是什么吗?
  • @var1 是一个用户变量(它可以被称为任何你喜欢的名字,我选择了@var1 以与文档保持一致) - 有关使用用户变量的更多信息,请参阅dev.mysql.com/doc/refman/8.0/en/load-data.html .
【解决方案2】:

在这种情况下,为了避免与逗号不正确存在相关的问题,您可以在单列表中导入行 .. ..(根据需要在 Medimun TEXT 上输入 TEXT 类型)

使用locate(一个用于第一个逗号,一个用于第二个,一个用于第三个..)和substring,您可以从每行中提取您需要的四列

最后使用insert select,您可以填充目标表.. 根据需要分隔列..

【讨论】:

    【解决方案3】:

    评论太长了。

    您的 CSV 文件中有一个可怕的数据格式。我认为你应该重新生成文件。

    MySQL 具有帮助您处理这些数据的工具,尤其是LOAD DATA INFILE 中的OPTIONALLY ENCLOSED BY 选项。唯一需要注意的是,这允许 一个 转义字符而不是两个。

    我的第一个建议是将字段分隔符替换为另一个字符 - 想到制表符或 |。任何不用于字段中的值的字符。

    第二种是对OPTIONALLY ENCLOSED BY 使用双引号。然后将数据文件中的'[' 替换为'"[',将] 替换为']"'。即使您无法重新生成文件,您也可以使用 grep、pearl 或 python 之类的东西对其进行预处理,以进行这种简单的替换。

    然后您可以使用 MySQL 的导入工具来加载文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      相关资源
      最近更新 更多