【问题标题】:How to fix MySQL 8 error codes : 1525 and 1292?如何修复 MySQL 8 错误代码:1525 和 1292?
【发布时间】:2020-02-14 06:53:21
【问题描述】:

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

  1. 错误代码:1525。不正确的 DATE 值:'2019-09-31'。

  2. 警告代码:1292。日期时间值不正确:第 1 行的列“date_column”的日期时间值不正确。

谁能建议如何解决/修复/忽略 mysql 8 上无效日期的这些错误?

我们正在将我们的数据库服务器从 MySQL 5 迁移到 MySQL 8。我在两台服务器上运行以下 2 个查询:-

查询一: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 服务器上,查询 1 中断并出现错误代码 1525,而查询 2 成功运行但没有结果(尽管有结果),警告代码为 1292 和消息“不正确的日期时间值:''2019 -09-31 23:59:59'' 第 1 行的列 'date_column'。

【问题讨论】:

  • 9 月只有 31 天。参考一个有效的日子,你会没事的。例如'2019-09-30''2019-10-01'
  • 您可以错误地配置 8.x 服务器以接受无效日期,但它很可能稍后会回来并咬您一口。是否有机会修复无效记录?
  • 谢谢 Gordon,但我只想解决无效日期。
  • @ÁlvaroGonzález 我尝试使用“ALLOW_INVALID_DATES”配置 mysql 8 服务器,但在这种情况下查询不会返回任何结果。
  • @GordonLinoff,“9 月只有 31 天”?!?

标签: mysql sql database datetime mysql-8.0


【解决方案1】:

较小的坏处可能是为迁移脚本和受影响的应用程序更改会话范围的 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)

【讨论】:

【解决方案2】:

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' ;

【讨论】:

  • 感谢@Ankit Bajpai,但我只想解决无效日期。
  • 9-31 实际上是无效日期。
  • 再次提及:- 当我们从 MySQL 5 迁移到 MySQL 8 时,修复无效的日期查询需要大量的代码更改工作。因此,我正在寻找一种解决方案,该解决方案只需要更改配置即可。
【解决方案3】:

我无法在 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;

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多