Ошибка загрузки данных в MySQL - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь загрузить данные из CSV-файла в таблицу в MySQL. Хотя все кажется в порядке, по некоторым причинам это не работает для меня, в то время как член моей команды смог загрузить его успешно. У нас обоих есть одно и то же определение таблицы и данные.

Определение моей таблицы выглядит так, как показано ниже

   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

enter image description here

И иногда я получаю Data Truncated for column 'MO_TIME' at row 1,1265

Как видите, это очень противоречиво. Но с данными нет проблем, потому что они хорошо работали для моей команды. Имеет ли это какое-либо отношение к ограничениям / индексу?

Я столкнулся с похожей странной проблемой и для других таблиц. Но я TRUNCATED таблицы и загрузил его снова, и он работал нормально.

Я попробовал то же самое здесь, но это не помогает

1 Ответ

2 голосов
/ 31 октября 2019

Ваш столбец VALUE НЕБОЛЬШОЙ без подписи. В чате вы сказали, что он вставлен как 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, поскольку числовые типы без знака поддерживают только неотрицательные значения.

Нечто подобное происходит с датой и временем, если вы пытаетесь вставить недопустимое значение. Например, распространенной ошибкой является использование дат в формате ММ / ДД / ГГГГ, которые 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.

...