Неверное значение даты и времени 0000-00-00 00:00:00 +0000 Номер ошибки базы данных: 1292
Привет всем У меня проблемы с обновлением сервера, сделанным моей хостинговой компанией, и я пытаюсь понять, что происходит, поэтому я могу исправить проблему
Мой сервер недавно был обновлен до версии сервера: 5.6.17, и я получаю ошибки повсюду, говоря, что мое значение даты и времени неверно?
Кажется, он добавляет +0000 к концу datetime, но я не уверен, почему. Это работало отлично на 5.5, но недавнее обновление повлияло на то, как работают мои временные метки
Error Number: 1292 Incorrect datetime value: '2014-04-02 08:49:43 +0000' for column 'created' at row 1 INSERT INTO `activitylog` (`tablename`, `row`, `user_id`, `description`, `action`, `private`,`created`) VALUES ('user', '1', '1', 'People', 'Updated', 0, '2014-04-02 08:49:43 +0000')
Если я изменяю этот sql-запрос без +0000, он работает?
Это влияет на все, что является типом DATETIME на моем столе.
У кого-то еще была аналогичная проблема, и теперь, какое решение должно заставить это работать. В настоящий момент мне нужно изменить все мои PHP-функции, чтобы повторять дату / время, а не я вызываю NOW () в строке запроса
Я обнаружил, что после обновления до MySQL 5.7 эта ошибка возникла в случайных ситуациях, даже когда я не поставлял дату в запросе.
Похоже, что предыдущие версии MySQL поддерживали даты, такие как 0000-00-00 00:00:00
(по умолчанию), однако 5.7.4 внесли некоторые изменения в настройку NO_ZERO_DATE
. Если у вас все еще есть старые данные при использовании более новой версии MySQL, тогда могут возникнуть случайные ошибки.
Мне нужно было выполнить такой запрос, чтобы сбросить все нулевые даты до другой даты.
# If the columns supports NULL, use that UPDATE table SET date_column = NULL WHERE date_column < '1000-01-01'; # Otherwise supply another default date UPDATE table SET date_column = '1970-01-01' WHERE date_column < '1000-01-01';
Кроме того, вы можете настроить параметр NO_ZERO_DATE
, хотя обратите внимание на то, что говорят о нем документы:
Режим
NO_ZERO_DATE
влияет на то, разрешает ли серверу «0000-00-00» в качестве действительной даты. Его эффект также зависит от того, включен ли строгий режим SQL.
Если этот режим не включен, допускается «0000-00-00», и вставки не выдают никаких предупреждений.
Если этот режим включен, «0000-00-00» разрешен, а вставки выдают предупреждение.
Если этот режим и строгий режим разрешены, «0000-00-00» не разрешен, а вставки создают ошибку, если IGNORE не указан. Для
INSERT IGNORE
иUPDATE IGNORE
разрешено «0000-00-00», а вставки выдают предупреждение.Начиная с MySQL 5.7.4,
NO_ZERO_DATE
устарел. В MySQL с 5.7.4 по 5.7.7NO_ZERO_DATE
ничего не делает, если явно указано. Вместо этого его эффект включен в эффекты строгого режима SQL. В MySQL 5.7.8 и более позднихNO_ZERO_DATE
имеет эффект при явном явном выражении и не является частью строгого режима, как и до MySQL 5.7.4. Однако он должен использоваться в сочетании со строгим режимом и включен по умолчанию. Предупреждение появляется, еслиNO_ZERO_DATE
активирован без включенияNO_ZERO_DATE
режима или наоборот. Дополнительные обсуждения см. В разделе Изменения режима SQL в MySQL 5.7.Поскольку
NO_ZERO_DATE
устарел, он будет удален в будущей версии MySQL в виде отдельного имени режима, а его эффект включен в эффекты строгого режима SQL.С http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date
Тип данных TIMESTAMP
используется для значений, содержащих как дату, так и время. TIMESTAMP
имеет диапазон '1970-01-01 00:00:01' UTC
to '2038-01-19 03:14:07' UTC
.
Тип DATETIME
используется для значений, содержащих как дату, так и время. MySQL извлекает и отображает значения DATETIME
в 'YYYY-MM-DD HH:MM:SS'
. Поддерживаемый диапазон: '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
.
вы должны использовать этот тип в формате DateTime
INSERT INTO `activitylog` (`tablename`, `row`, `user_id`, `description`, `action`, `private`,`created`) VALUES ('user', '1', '1', 'People', 'Updated', 0, '2014-04-02 08:49:43')
https://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html
https://dev.mysql.com/doc/refman/5.0/en/datetime.html
http://bugs.mysql.com/bug.php?id=70188
вы должны удалить space
как ваш код '2014-04-02 08:49:43 +0000'
и изменить код наподобие '2014-04-02 08:49:43+0000'
поскольку полный запрос следующий:
INSERT INTO `activitylog` (`tablename`, `row`, `user_id`, `description`, `action`, `private`,`created`) VALUES ('user', '1', '1', 'People', 'Updated', 0, '2014-04-02 08:49:43+0000')
смотрите здесь: http://sqlfiddle.com/#!2/a2581/23099
Короткий ответ – NOW()
в вашем запросе должен отлично работать с столбцом MySQL DATETIME
.
Более длинный ответ – я не уверен, как вы когда-либо видели +0000
. Столбец DATETIME
форматируется как 'YYYY-MM-DD HH:MM:SS'
. Когда дело доходит до разницы в часовом поясе, обычно это то, что вам нужно для программной обработки. MySQL выполняет конвертирование локальных времен в UTC и обратно при хранении и извлечении данных TIMESTAMP
но это не делает это с DATETIME
или другими столбцами Date / Time.
Хорошо, поэтому у меня была такая же ошибка. То, что я сделал, чтобы исправить это, было использование этих строк кода для запроса базы данных, с которой у меня возникли проблемы:
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session; SET sql_mode = ''; SET GLOBAL sql_mode = '';
Первая строка кода (SELECT) предназначена для просмотра текущих настроек для «СЕССИИ» и «ГЛОБАЛЬНОГО». После того, как вы установили их как для пустых строк, так и для повторного выбора, они ничего не должны возвращать (быть пустыми).
Вам также может потребоваться использовать SET SESSION sql_mode = '';
но это решило проблему для меня. В принципе, один из параметров в нем поднимал способ ввода даты в базу данных (я получал ее в формате «YYYY-MM-DD HH: MM: SS AM / PM»). Удаление NO_ZERO_IN_DATE
и другая опция даты не помогли мне.
Мой сайт работает так, как сейчас. Надеюсь, это поможет.