为什么我的数据被截断了?警告 | 1265 | 数据列被截断

4
我尝试将date_of_birth和date_of_death都添加为NULL,但这并没有帮助。为什么数据被截断了?(特别是因为目前没有任何数据...)
此外,我完全不理解警告1261。第5行与第1-4行没有任何区别。
谢谢!
以下是脚本内容:
-- create the people table
DROP TABLE IF EXISTS people;

CREATE TABLE people (
full_name varchar (50) NOT NULL,
people_ID varchar (15) NOT NULL,
date_of_birth DATE,
date_of_death DATE,
PRIMARY KEY(people_ID))
ENGINE = INNODB;

LOAD DATA LOCAL INFILE "People.csv"
INTO TABLE people
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;  

给我这些错误:
Query OK, 5 rows affected, 10 warnings (0.00 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 10

mysql> show warnings;
+---------+------+----------------------------------------------------+
| Level   | Code | Message                                            |
+---------+------+----------------------------------------------------+
| Warning | 1265 | Data truncated for column 'date_of_birth' at row 1 |
| Warning | 1265 | Data truncated for column 'date_of_death' at row 1 |
| Warning | 1265 | Data truncated for column 'date_of_birth' at row 2 |
| Warning | 1265 | Data truncated for column 'date_of_death' at row 2 |
| Warning | 1265 | Data truncated for column 'date_of_birth' at row 3 |
| Warning | 1265 | Data truncated for column 'date_of_death' at row 3 |
| Warning | 1265 | Data truncated for column 'date_of_birth' at row 4 |
| Warning | 1265 | Data truncated for column 'date_of_death' at row 4 |
| Warning | 1265 | Data truncated for column 'date_of_birth' at row 5 |
| Warning | 1261 | Row 5 doesn't contain data for all columns         |
+---------+------+----------------------------------------------------+
10 rows in set (0.00 sec)

mysql> select * from people;
+-------------------+-----------+---------------+---------------+
| full_name         | people_ID | date_of_birth | date_of_death |
+-------------------+-----------+---------------+---------------+
| Harry Dunham      | H_Dunham  | 0000-00-00    | NULL          |
| Julien Bryan      | J_Bryan   | 0000-00-00    | 0000-00-00    |
| Jules V.D. Bucher | J_Bucher  | 0000-00-00    | 0000-00-00    |
| Miriam Bucher     | M_Bucher  | 0000-00-00    | 0000-00-00    |
| Paul Bowles       | P_Bowles  | 0000-00-00    | 0000-00-00    |
+-------------------+-----------+---------------+---------------+
5 rows in set (0.01 sec)

这是我的 .csv 文件:

FullName,People_ID,DOB,DOD
Jules V.D. Bucher,J_Bucher,,
Miriam Bucher,M_Bucher,,
Julien Bryan,J_Bryan,,
Paul Bowles,P_Bowles,,
Harry Dunham,H_Dunham,,
2个回答

6
也许发生的情况是Mysql试图将空字符串""强制转换到您的日期列中,但该列仅接受格式为DATE的数据,因此它被转换为正确的格式。尝试调整CSV文件,使其中一行在日期列中有"0000-00-00"而不是只有""(空白),看看是否会收到更少的警告。
1261警告看起来也是同样的问题 - 可能是Mysql处理CSV导入时的怪癖,可能是无害但令人烦恼的问题 - 除非您看到导入的数据不完整的证据,否则不必担心。

好的!谢谢!我没有注意到任何“真正”的问题,所以我想现在就先忽略它。 - Bleakley

5
综合考虑,我推断您的CSV文件包含DOS风格的行尾符(\r\n),而您已经指示MySQL使用UNIX风格的行尾符(\n)来解释该文件。

因此,这些\r字符被视为数据,在字符串转换为DATE时,\r被“截断”为无效字符,并且最后一行确实不包含该列的任何数据(因为您没有在CSV文件末尾写入空行)。这就是最后一行与其他行不同的原因。

您可以通过使用更适当的LINES TERMINATED BY指令来解决此问题

LOAD DATA LOCAL INFILE "People.csv"
INTO TABLE people
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

MySQL将允许\r\n序列被视为行尾。您还有另一个问题,即您告诉MySQL您的字段被"包围,而实际上并非如此。您可以删除ENCLOSED BY指令,或在其前面加上OPTIONALLY:如果输入值不一定用引号括起来,请在ENCLOSED BY关键字之前使用OPTIONALLY。您应该阅读所使用技术的文档。

谢谢!我该如何使我的CSV文件以UNIX风格而不是DOS风格结尾?是的,一旦确定不需要它,我会注释掉Enclosed By。 - Bleakley
@Blake:这将取决于您使用的文本编辑器。或者,如果您在Linux上,您可以通过命令行传递它通过dos2unix - Lightness Races in Orbit
我在Mac上使用TextWrangler。 - Bleakley
@Blake:阅读其文档以了解如何配置行尾。 - Lightness Races in Orbit
好的,我会检查一下。谢谢! - Bleakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接