MySQL 5.6 - 加载数据infile切断数据(不涉及空值)

时间:2013-12-01 07:42:04

标签: mysql

我在处理项目时遇到过这个问题,但这是一个复制“bug”的简单示例......

首先创建一个表,最后一列是某种varchar:

Create table testtable(
ProductName varchar(100),
Color varchar(50),
CategoryID varchar(5)
);

使用数据创建制表符分隔的文本文件:

Shirt   Red 1111
Pants   Blue    2222
Shoes   Green   3333

将数据上传到表格中:

load data infile 'testtable.txt' into table testtable;

我没有任何错误或警告或任何东西。但是,当我尝试查询数据时,它看起来很奇怪:

select * from testtable;
    ProductName Color   CategoryID
                Red     1111
                Blue    2222
        Shoes   Green   3333

将加入ProductName的查询将无效。

接下来,创建一个以int作为最后一列的表:

Create table fixedtable(
ProductName varchar(100),
Color varchar(50),
CategoryID varchar(5),
Inventory int
);

使用数据创建制表符分隔的文本文件:

Shirt   Red 1111    10
Pants   Blue    2222    15
Shoes   Green   3333    20

将数据上传到表格中:

load data infile 'fixedtable.txt' into table fixedtable;

现在桌子看起来很好:

    select * from fixedtable;
ProductName Color   CategoryID  Inventory
    Shirt   Red     1111        10
    Pants   Blue    2222        15
    Shoes   Green   3333        20

我没有尝试使用“插入”或类似的东西复制它;对于这个项目,我特别需要使用“load data infile”语句。

这可能更容易用截图解释,但我缺乏正确的声誉......我想知道是否有其他人在他们的机器上得到这个结果?为了记录,我使用的是Windows 7。

我做错了吗?知道是什么导致了这个吗?

1 个答案:

答案 0 :(得分:1)

我可以重现这一点。这种行为很奇怪,我认为MySQL的导入可以“猜测”,当它知道在行末有一个数字时会更好。

我认为问题正在发生,因为你在Windows上,因此文本文件在每行的末尾都有\ r \ n而不是\ n。当您使用没有设置的LOAD DATA INFILE时,它使用默认值,其中行以\ n结尾。来源 - http://dev.mysql.com/doc/refman/5.6/en/load-data.html搜索“如果您未指定FIELDS或LINES子句”。

要修复它,只需指定LINES TERMINATED BY“\ r \ n”部分。例如:

mysql> Create table testtable(
-> ProductName varchar(100),
-> Color varchar(50),
-> CategoryID varchar(5)
-> );
Query OK, 0 rows affected (0.12 sec)

mysql> load data infile 'testtable.txt' into table testtable;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM testtable;
+-------------+-------+------------+
| ProductName | Color | CategoryID |
+-------------+-------+------------+
  |       | Red   | 1111
  |       | Blue  | 2222
| Shoes       | Green | 3333       |
+-------------+-------+------------+
3 rows in set (0.00 sec)

mysql> DELETE FROM testtable;
Query OK, 3 rows affected (0.02 sec)

mysql> load data infile 'testtable.txt' into table testtable
    -> LINES TERMINATED BY '\r\n';
Query OK, 3 rows affected (0.01 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM testtable;
+-------------+-------+------------+
| ProductName | Color | CategoryID |
+-------------+-------+------------+
| Shirt       | Red   | 1111       |
| Pants       | Blue  | 2222       |
| Shoes       | Green | 3333       |
+-------------+-------+------------+
3 rows in set (0.00 sec)

所以,你会使用这个SQL:

load data infile 'testtable.txt' into table testtable LINES TERMINATED BY '\r\n';