Я конвертирую БД из MyISAM в InnoDb. Я получаю сообщение об ошибке #1292 Неверное значение даты и времени: «0000-00-00 00:00:00». Я читал о некоторых из этих ошибок, но не могу изменить способ хранения информации в БД. Он сохраняется в указанном выше формате. Есть ли хорошее решение для этого?
Спасибо. Я хотел бы, но при использовании следующего запроса: UPDATE mytable
SET имя_столбца = NULL, ГДЕ имя_столбца = '0000-00-00 00:00:00', я получаю ту же ошибку - это неправильное значение времени. Я не могу изменить структуру столбцов, которая является DATETIME. NULL - это новое значение по умолчанию, но не было, когда вводились некоторые данные.
Из https://stackoverflow.com/a/37780259/378779: UPDATE users SET col = NULL WHERE CAST(col AS CHAR(20)) = '0000-00-00 00:00:00';
спасибо @kmoser, это не работает в этой среде, так как по умолчанию используется этот плохой формат, и поскольку его основная таблица WP вы должны быть осторожны, изменяя это
Вот ошибка:
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, поскольку их значение по умолчанию ограничивает возможность их изменения. Это решение имеет смысл.
поэтому следующая проблема заключается в том, что это 0000-00-00 00:00:00 является значением по умолчанию для 4 столбцов в этой главной таблице WP. Способы обойти это, кроме изменения значения по умолчанию, что кажется рискованным
Я бы изменил значение по умолчанию. Если у вас нет значения по умолчанию, не объявляйте его. Это нормально, если таблица не имеет значения по умолчанию и также НЕ NULL, это означает, что любая INSERT должна указывать значение, иначе будет получена ошибка. Очевидно, что это требует, чтобы вы сначала тщательно протестировали свое приложение, иначе у вас могут возникнуть сбои.
Хорошо, я могу попробовать. Это значения по умолчанию, установленные WP, а не мной, поэтому я нервничал.
К сожалению, это плохое дизайнерское решение в WP, полагаться на недопустимые значения даты. Многие плагины WP также придерживались этого соглашения. Сейчас трудно исправить столько независимых плагинов. Читать core.trac.wordpress.org/ticket/41785
оценил. Спасибо ВП
Не храните такие даты, которых все равно не существует. Магазин
NULL
вместо этого.