mysql "datetime NOT NULL DEFAULT '1970-01-01'" превращается в 0000-00-00 00:00:00 - PullRequest
1 голос
/ 08 сентября 2010

У меня есть столбец, созданный как

`date_start` datetime NOT NULL DEFAULT '1970-01-01'

Однако, когда я загружаю данные из CSV-файла с помощью команды LOAD DATA с пустой записью для date_start, сохраняется значение 0000-00-00 00:00:00?

Ответы [ 5 ]

1 голос
/ 08 сентября 2010

NULL и «пустая запись» не всегда обрабатываются одинаково в MySql.В случае типа данных datetime пустые записи автоматически преобразуются в 0000-00-00 00:00:00.Вы можете думать об этом как о форме приведения типов, при которой пробел возвращает тип к нулю.

В вашем файле данных попробуйте заменить все пустые даты ключевым словом DEFAULT.

0 голосов
/ 08 сентября 2010

MySQL имеет раздражающее (на мой взгляд) поведение, которое при некоторых обстоятельствах, если ему дано недопустимое значение для хранения в столбце, вместо этого будет хранить предопределенное «значение ошибки».Например, в контексте даты или даты и времени он будет хранить «нулевую дату», которую вы заметили;для столбца ENUM он будет хранить '' (соответствует 0 в числовом контексте) в качестве значения ошибки.

Хотя это не элегантно, вы можете попытаться выполнить импорт и разрешить вставку недопустимых нулевых дат,а затем выдача

UPDATE
    table_name
SET
    date_start = '1970-01-01 00:00:00'
WHERE
    date_start = '0000-00-00 00:00:00'
0 голосов
/ 08 сентября 2010

Режим MySQL SQL по умолчанию допускает нулевые даты.

Я считаю, что команда LOAD DATA INFILE считывает пустую позицию, предназначенную для DATETIME, и автоматически использует нулевую дату перед вставкой.Это объясняет, почему ограничение по умолчанию не применяется - значение при вставке не равно нулю.

Я думаю, у вас есть два варианта:

  1. Обновить все пробелы вваш CSV от ",," до ", NULL," или ", DEFAULT", поэтому они будут правильно интерпретироваться
  2. Изменить режим SQL : SET SQL_MODE='NO_ZERO_DATE'
0 голосов
/ 08 сентября 2010

Если вы не указываете значение при вставке данных, используется значение по умолчанию, но когда вы вставляете данные из CSV-файла, оно указывает значение для поля, поэтому значение по умолчанию не используется.

Пустая запись является недопустимым значением для поля даты и времени, поэтому вместо него используется значение 0000-00-00 00:00:00, так же как и любое значение, которое не может быть проанализировано для действительной даты (или частичной даты).

0 голосов
/ 08 сентября 2010

datetime означает, что ваш столбец хранит дату и время в формате Y-m-d H:i:s (0000-00-00 00:00:00).

date означает, что в вашем столбце хранится только дата в формате Y-m-d (0000-00-00).

...