【问题标题】:Why is my data being truncated? Warning | 1265 | Data truncated for column为什么我的数据被截断?警告 |第1265章列截断数据
【发布时间】:2015-05-02 23:36:49
【问题描述】:

我尝试将 NULL 添加到 date_of_birth 和 date_of_death,但这没有帮助。为什么数据会被截断? (特别是因为目前没有任何数据......)

另外,我根本不理解警告 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,,

【问题讨论】:

    标签: mysql date null warnings truncated


    【解决方案1】:

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

    1261 警告看起来更相似——在 Mysql 如何处理 CSV 导入方面可能无害但令人讨厌的怪癖——除非你看到证据表明你的导入数据不完整,否则我不会担心。

    【讨论】:

    • 好的!谢谢!我没有注意到任何“真正的”问题,所以我想我暂时忽略它。
    【解决方案2】:

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

    因此,那些\r 字符被视为数据,\r 在字符串到DATE 的转换过程中被“截断”为虚无,最后一行确实不包含最后一列的任何数据(因为您没有在 CSV 文件的末尾写一个空行)。这就是最后一行的不同之处。

    你其实可以fix this by using a more appropriate LINES TERMINATED BY directive:

    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 指令,or precede it with OPTIONALLY:

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

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

    【讨论】:

    • 谢谢!我将如何让我的 CSV 结尾成为 UNIX 风格而不是 DOS 风格?是的,一旦我确定我不需要它,我会注释掉 Enclosed By。
    • @Blake:这取决于您使用的文本编辑器。或者,如果您使用的是 Linux,则可以从命令行通过 dos2unix 传递它。
    • 我在 Mac 上使用 textWrangler。
    • @Blake:阅读其文档以了解如何配置行尾。
    • 好的。我会检查一下。谢谢!
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2019-11-17
    • 2020-12-20
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多