MySQL 8.0.16:选择日期喜欢查询失败



我有 3 台 MySQL/MariaDB 服务器用于应用程序开发和测试:

  • MySQL Community Server 5.7.32
  • MySQL Community Server 8.0.16
  • MariaDB Community Server 10.4.12

服务器配置为在同一台计算机上的不同端口上运行。

所有服务器的SELECT @@sql_mode

  • MySQL Community Server 5.7.32NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • MySQL Community Server 8.0.16STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
  • MariaDB Community Server 10.4.12NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION

我在我维护的旧代码中偶然发现了一些无法运行的 SELECT 查询,例如搜索具有给定模式的日期。查询如下所示:

SELECT * FROM `userTable` WHERE `birthDate` LIKE '2020-%-%';
SELECT * FROM `userTable` WHERE `birthDate` LIKE '%12%';

该表如下所示:

CREATE TABLE IF NOT EXISTS `userTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` TEXT COLLATE utf8_unicode_ci,
`birthDate` DATE,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我在MySQL Community Server 8.0.16上运行查询时,它们会失败并显示错误Error Code: 1525. Incorrect DATE value: '2020-%-%'.Error Code: 1525. Incorrect DATE value: '%12%'..

MySQL Community Server 5.7.32MariaDB Community Server 10.4.12成功执行查询。

为什么MySQL Community Server 8.0.16无法执行这些 SELECT 查询?

PS:第一个 SELECT 查询可以写成

SELECT * FROM `userTable` WHERE YEAR(`birthDate`) = 2020;

在所有 3 台服务器上运行。

编辑:这是MySQL Community Server 8.0.16中的一个错误,并在版本8.0.22中修复。

您应该将真正的日期列与有效的日期文字(而不是字符串)进行比较,例如查找 2020 年的记录:

SELECT *
FROM userTable
WHERE birthDate >= '2020-01-01' AND birthDate < '2021-01-01';  -- sargable :-)

或者也许:

SELECT *
FROM userTable
WHERE YEAR(birthDate) = 2020;  -- not sargable though :-(

相关内容

  • 没有找到相关文章

最新更新