我有 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.32
:NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
MySQL Community Server 8.0.16
:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
MariaDB Community Server 10.4.12
:NO_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.32
和MariaDB 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 :-(