MySQL 加载数据失败
Load data failure in MySQL
我正在尝试将数据从 csv 文件加载到 MySQL 中的 table。虽然一切看起来都很好,但出于某种原因它对我不起作用,而我的团队成员能够成功加载它。我们都有相同的 table 定义和数据。
我的 table 定义如下所示
CREATE TABLE SIGNS (
ROW_ID MEDIUMINT UNSIGNED NOT NULL,
SUBJECT_ID MEDIUMINT UNSIGNED NOT NULL,
Test_ID MEDIUMINT UNSIGNED NOT NULL,
Name_ID TINYINT UNSIGNED NOT NULL,
date_ID TINYINT UNSIGNED NOT NULL,
race_NO MEDIUMINT UNSIGNED NOT NULL,
MO_TIME DATETIME NOT NULL,
ITEMID VARCHAR(255) NOT NULL,
VALUE SMALLINT UNSIGNED NOT NULL,
UNIQUE KEY SIGNS_ROW_ID (ROW_ID)
)
CHARACTER SET = UTF8;
我在 csv 文件中有一个数据,当我上传它时,可以正常处理 80 条记录。但是大约 20 条记录会抛出以下错误。
有时,我会收到错误消息 Out of range value for column 'VALUE' at row 438575
有时我得到 Data Truncated for column 'MO_TIME' at row 1,1265
如您所见,它非常不一致。但是数据没有问题,因为它对我的团队成员来说效果很好。跟constraints/index有关系吗?
我也遇到了其他 table 的类似奇怪问题。但是我截断了 table 并再次加载它并且它工作正常。
我在这里也试过了,但没用
您的 VALUE 列是 SMALLINT UNSIGNED。在聊天中,您说它在警告超出范围值的行中插入为 0。
看看我做的这个测试:
mysql> create table t ( i smallint unsigned);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t set i = -150;
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'i' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+------+
| i |
+------+
| 0 |
+------+
如果您尝试将负值插入 smallint unsigned 列,则它超出了 unsigned 支持的范围。它被截断为 0,因为无符号数字类型仅支持非负值。
如果您尝试插入无效值,日期时间会发生类似情况。例如,一个常见的错误是使用 MM/DD/YYYY 格式的日期,MySQL 不支持:
mysql> create table t2 (mo_time datetime);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t2 set mo_time = '10/31/2019';
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+----------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------+
| Warning | 1265 | Data truncated for column 'mo_time' at row 1 |
+---------+------+----------------------------------------------+
这显示了与您收到的相同的错误消息。
mysql> select * from t2;
+---------------------+
| mo_time |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
啊哈,过去被视为默认值的无意义日期值。值得庆幸的是,在 MySQL 的最新版本中,它被禁止了。
MySQL 仅支持 YYYY-MM-DD 格式。实际上,各部分之间的标点符号是可选的。有关详细信息,请参阅 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html。
我正在尝试将数据从 csv 文件加载到 MySQL 中的 table。虽然一切看起来都很好,但出于某种原因它对我不起作用,而我的团队成员能够成功加载它。我们都有相同的 table 定义和数据。
我的 table 定义如下所示
CREATE TABLE SIGNS (
ROW_ID MEDIUMINT UNSIGNED NOT NULL,
SUBJECT_ID MEDIUMINT UNSIGNED NOT NULL,
Test_ID MEDIUMINT UNSIGNED NOT NULL,
Name_ID TINYINT UNSIGNED NOT NULL,
date_ID TINYINT UNSIGNED NOT NULL,
race_NO MEDIUMINT UNSIGNED NOT NULL,
MO_TIME DATETIME NOT NULL,
ITEMID VARCHAR(255) NOT NULL,
VALUE SMALLINT UNSIGNED NOT NULL,
UNIQUE KEY SIGNS_ROW_ID (ROW_ID)
)
CHARACTER SET = UTF8;
我在 csv 文件中有一个数据,当我上传它时,可以正常处理 80 条记录。但是大约 20 条记录会抛出以下错误。
有时,我会收到错误消息 Out of range value for column 'VALUE' at row 438575
有时我得到 Data Truncated for column 'MO_TIME' at row 1,1265
如您所见,它非常不一致。但是数据没有问题,因为它对我的团队成员来说效果很好。跟constraints/index有关系吗?
我也遇到了其他 table 的类似奇怪问题。但是我截断了 table 并再次加载它并且它工作正常。
我在这里也试过了,但没用
您的 VALUE 列是 SMALLINT UNSIGNED。在聊天中,您说它在警告超出范围值的行中插入为 0。
看看我做的这个测试:
mysql> create table t ( i smallint unsigned);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t set i = -150;
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'i' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from t;
+------+
| i |
+------+
| 0 |
+------+
如果您尝试将负值插入 smallint unsigned 列,则它超出了 unsigned 支持的范围。它被截断为 0,因为无符号数字类型仅支持非负值。
如果您尝试插入无效值,日期时间会发生类似情况。例如,一个常见的错误是使用 MM/DD/YYYY 格式的日期,MySQL 不支持:
mysql> create table t2 (mo_time datetime);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t2 set mo_time = '10/31/2019';
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+----------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------+
| Warning | 1265 | Data truncated for column 'mo_time' at row 1 |
+---------+------+----------------------------------------------+
这显示了与您收到的相同的错误消息。
mysql> select * from t2;
+---------------------+
| mo_time |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
啊哈,过去被视为默认值的无意义日期值。值得庆幸的是,在 MySQL 的最新版本中,它被禁止了。
MySQL 仅支持 YYYY-MM-DD 格式。实际上,各部分之间的标点符号是可选的。有关详细信息,请参阅 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html。