Как исправить ошибки MySQL 8 с кодами: 1525 и 1292? - PullRequest
1 голос
/ 17 октября 2019

Для недопустимых дат на сервере Mysql 8 я получаю 2 типа ошибок: -

  1. Код ошибки: 1525. Неверное значение даты: '2019-09-31'.

  2. Код предупреждения: 1292. Неправильное значение даты и времени: «2019-09-31 23:59:59» для столбца'date_column' в строке 1.

Может кто-нибудь подсказать, как исправить / исправить / игнорировать эти ошибки для недопустимых дат в mysql 8?

Мы переносим наши серверы баз данных с MySQL 5 на MySQL 8 . Я выполняю следующие 2 запроса на обоих серверах: -

Запрос 1: SELECT * FROM db1.table1 WHERE date_column >= '2019-09-01 00:00:00' AND date_column <= '2019-09-31 23:59:59' ;

Запрос 2: SELECT * FROM db1.table1 WHERE date_column BETWEEN '2019-09-01 00:00:00' AND '2019-09-31 23:59:59' ;

В MySQL 5сервер , я не получаю сообщение об ошибке / предупреждение, и оба запроса возвращают одинаковые результаты.

На сервере mysql 8 , Query 1 прерывается с кодом ошибки 1525, в то время как Query 2 выполняется успешнобез результата (хотя есть результаты) с кодом предупреждения 1292 и сообщением «Неверное значение даты и времени:« 2019-09-31 23:59:59 »для столбца« date_column »в строке 1».

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Меньшее зло возможно в том, чтобы изменить режим SQL сеанса как для сценария миграции, так и для уязвимого приложения - это должно быть простым одноразовым изменением (если код подключения не копируется + вставляется в сотнях мест)). Режим, допускающий недопустимые даты: ALLOW_INVALID_DATES :

SET @@SESSION.sql_mode = CONCAT_WS(',', @@SESSION.sql_mode, 'ALLOW_INVALID_DATES');

Полный демо :

mysql> CREATE TABLE foo (bar DATE);
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT @@SESSION.sql_mode;
+--------------------------------------------+
| @@SESSION.sql_mode                         |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO foo (bar) VALUES ('2019-02-30');
ERROR 1292 (22007): Incorrect date value: '2019-02-30' for column 'bar' at row 1
mysql> SET @@SESSION.sql_mode = CONCAT_WS(',', @@SESSION.sql_mode, 'ALLOW_INVALID_DATES');
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> INSERT INTO foo (bar) VALUES ('2019-02-30');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+------------+
| bar        |
+------------+
| 2019-02-30 |
+------------+
1 row in set (0.00 sec)
0 голосов
/ 17 октября 2019

В сентябре есть только 30 дней. Таким образом, ваши запросы должны быть следующими -

Запрос 1

SELECT *
FROM db1.table1
WHERE date_column >= '2019-09-01 00:00:00' AND date_column <= '2019-09-30 23:59:59';

Запрос 2

SELECT *
FROM db1.table1
WHERE date_column BETWEEN '2019-09-01 00:00:00' AND '2019-09-30 23:59:59' ;
...