今天写代码发现这个问题,平常写sql的时候一般in的参数为空的时候我都是把这个条件给去掉。但是今天在项目上调整的时候发现2个数据库查询的结果不一致,发现sql中存在 in (0)的情况 。
简单记录下
数据表
CREATE TABLE `ceshi` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`note` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`code` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
数据
查询1
查询2
查询3
查询4
查询5
查询6
结果
在字段类型和参数类型一致下 in 会匹配对应的值,但是当类型为varchar 时 in (0) 会默认返回所有非空的数据,而当类型为数据类型参数为字符串类型会隐式转换进行匹配。