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

Ble*_*ley 3 mysql null warnings date truncated

我尝试向 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;  
Run Code Online (Sandbox Code Playgroud)

给我这些错误:

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)
Run Code Online (Sandbox Code Playgroud)

这是我的 .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,,
Run Code Online (Sandbox Code Playgroud)

Top*_*unt 5

也许正在发生的事情是 Mysql 试图将空字符串强制""到您的日期列中,但该列只接受DATE格式化的数据,因此它被转换为正确的格式。尝试调整您的 CSV 文件,使"0000-00-00"日期列中有一行而不是""(空白),看看是否收到更少的警告。

1261警告看起来像更多的相同-可能无害,但恼人的怪癖在MySQL如何处理CSV导入-我不会担心它,除非你看到的证据表明,导入的数据是不完整的。


Lig*_*ica 5

综上所述,我推测您的 CSV 文件包含 DOS 样式的行尾 ( \r\n),而您已指示 MySQL 使用 UNIX 样式的行尾 ( \n)来解释文件。

\r因此,这些字符被视为数据,\r在字符串到DATE转换过程中被“截断”为空,并且最后一行确实不包含该最后一列的任何数据(因为您没有在末尾写入空行) 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;
Run Code Online (Sandbox Code Playgroud)

然后 MySQL 将允许将\r\n序列视为行尾。

您还有另一个问题,那就是您告诉 MySQL 您的字段由 括起来",而事实并非如此。您可以删除该ENCLOSED BY指令,或在其前面加上OPTIONALLY

如果输入值不一定用引号括起来,请在 ENCLOSED BY 关键字之前使用 OPTIONALLY。

您应该阅读有关您使用的技术的文档。