Преобразование MyISAM в формат даты ошибки InnoDb

Я конвертирую БД из MyISAM в InnoDb. Я получаю сообщение об ошибке #1292 Неверное значение даты и времени: «0000-00-00 00:00:00». Я читал о некоторых из этих ошибок, но не могу изменить способ хранения информации в БД. Он сохраняется в указанном выше формате. Есть ли хорошее решение для этого?

Не храните такие даты, которых все равно не существует. Магазин NULL вместо этого.

sticky bit 20.12.2020 04:17

Спасибо. Я хотел бы, но при использовании следующего запроса: UPDATE mytable SET имя_столбца = NULL, ГДЕ имя_столбца = '0000-00-00 00:00:00', я получаю ту же ошибку - это неправильное значение времени. Я не могу изменить структуру столбцов, которая является DATETIME. NULL - это новое значение по умолчанию, но не было, когда вводились некоторые данные.

michael 20.12.2020 04:26

Из https://stackoverflow.com/a/37780259/378779: UPDATE users SET col = NULL WHERE CAST(col AS CHAR(20)) = '0000-00-00 00:00:00';

kmoser 20.12.2020 05:07

спасибо @kmoser, это не работает в этой среде, так как по умолчанию используется этот плохой формат, и поскольку его основная таблица WP вы должны быть осторожны, изменяя это

michael 20.12.2020 19:17
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
4
397
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ошибка:

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'd' at row 1

Почему это проблема? Потому что '0000-00-00 00:00:00' нарушает режимы sql NO_ZERO_DATE и NO_ZERO_IN_DATE. В MySQL 8.0 эти режимы неявны, когда вы используете STRICT_TRANS_TABLES или STRICT_ALL_TABLES.

Простое использование этого значения в вашем предложении WHERE при сравнении с датой и временем вызывает нарушение, потому что MySQL пытается преобразовать эту строку в значение даты и времени.

Вот решение: временно измените режим sql на нестрогий, чтобы разрешить недопустимые значения даты.

mysql> set sql_mode='';

Это изменяет sql_mode только во время вашего текущего сеанса. Как только вы выйдете из клиента mysql, параметры сеанса исчезнут, и при следующем открытии сеанса он возьмет параметр из глобальных настроек.

Это позволяет ОБНОВИТЬ, поэтому вы можете использовать эту недопустимую строку даты и времени в своем запросе, по крайней мере, достаточно долго, чтобы изменить соответствующие значения на NULL.

mysql> update mytable set d = null where d = '0000-00-00 00:00:00';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from mytable;
+----+------+
| id | d    |
+----+------+
|  1 | NULL |
+----+------+

Не делайте режим sql нестрогим, за исключением этой операции очистки. Хорошо использовать строгий режим sql, потому что он не позволяет базе данных хранить поддельные значения данных. Строгий режим также предотвращает усечение данных, если вы должны сохранить значение, которое не помещается в столбец.

Спасибо тебе за это. В таблицах WP по умолчанию используется устаревший ненужный TIMEFORMAT вместо NULL, поскольку их значение по умолчанию ограничивает возможность их изменения. Это решение имеет смысл.

michael 20.12.2020 19:12

поэтому следующая проблема заключается в том, что это 0000-00-00 00:00:00 является значением по умолчанию для 4 столбцов в этой главной таблице WP. Способы обойти это, кроме изменения значения по умолчанию, что кажется рискованным

michael 20.12.2020 19:28

Я бы изменил значение по умолчанию. Если у вас нет значения по умолчанию, не объявляйте его. Это нормально, если таблица не имеет значения по умолчанию и также НЕ NULL, это означает, что любая INSERT должна указывать значение, иначе будет получена ошибка. Очевидно, что это требует, чтобы вы сначала тщательно протестировали свое приложение, иначе у вас могут возникнуть сбои.

Bill Karwin 20.12.2020 20:00

Хорошо, я могу попробовать. Это значения по умолчанию, установленные WP, а не мной, поэтому я нервничал.

michael 20.12.2020 20:27

К сожалению, это плохое дизайнерское решение в WP, полагаться на недопустимые значения даты. Многие плагины WP также придерживались этого соглашения. Сейчас трудно исправить столько независимых плагинов. Читать core.trac.wordpress.org/ticket/41785

Bill Karwin 20.12.2020 20:34

оценил. Спасибо ВП

michael 20.12.2020 20:59

Другие вопросы по теме