如何修复 MySQL 8 个错误代码:1525 和 1292?

How to fix MySQL 8 error codes : 1525 and 1292?

对于 Mysql 8 服务器上的无效日期,我遇到了 2 种类型的错误 :-

  1. 错误代码:1525。不正确的日期值:“2019-09-31”。

  2. 警告代码:1292。日期时间值不正确:第 1 列 'date_column' 的“2019-09-31 23:59:59”。

任何人都可以建议如何解决/修复/忽略 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 服务器 上,我没有收到任何错误/警告,而且两个查询 return 的结果相同。

在 mysql 8 服务器 上,查询 1 中断,错误代码为 1525,而查询 2 成功运行,没有结果(尽管有结果),警告代码为 1292 和留言 "Incorrect datetime value: ''2019-09-31 23:59:59'' for column 'date_column' at row 1" .

9月只有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' ;

较小的危害可能是为迁移脚本和受影响的应用程序更改会话范围的 SQL 模式——这应该是一个简单的一次性更改(只要不复制连接代码) +粘贴在一百个地方)。允许无效日期的模式是 ALLOW_INVALID_DATES:

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

完整 demo:

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)

我无法在 MySQL 8.0 中使用以下更新语句更新记录,出现 1525 错误,但我可以 运行 在 5.1

UPDATE agency 
    VALIDATION_DESCRIPTION = CONCAT(IFNULL(VALIDATION_DESCRIPTION,''),'Accounting Date Key is Missing',"::  ::")
    WHERE (date(ACCOUNTING_DATE_KEY) IS NULL OR date(ACCOUNTING_DATE_KEY) ='') and agency_id=1;