在 Java 的 MyBatis-Plus 框架中,QueryWrapper.eq(“column”, value) 默认是区分大小写进行比较的,除非数据库的排序规则(collation)使得查询变成不区分大小写。
如果在使用该查询语句时,出现了不区分大小写的情况,有可能是以下几种情况:
1.数据库的 Collation 设置
MySQL:如果表的字符集是 utf8_general_ci(ci 代表 Case Insensitive),那么查询时是不区分大小写的。
使用一下sql:
SHOW CREATE TABLE your_table;
如果查询出结果是 COLLATE=utf8_general_ci,查询会不区分大小写。
2.数据库的查询模式
某些数据库或存储引擎(如 MySQL 的 InnoDB)默认查询是大小写不敏感的,特别是 VARCHAR 和 TEXT 字段。(这个应该是大多数不区分大小写问题的根源)
3.数据库连接配置
连接 MySQL 时,如果JDBC URL配置 useUnicode=true&characterEncoding=utf8&collation=utf8_general_ci,查询可能会默认忽略大小写。
解决方案:
方案 1:强制区分大小写(BINARY 关键字)
如果要查询时 强制区分大小写,可以使用 BINARY 关键字:
queryWrapper.eq(“BINARY column_name”, value);
但 MyBatis-Plus QueryWrapper 不支持 直接使用 BINARY,需要使用 apply():
queryWrapper.apply(“BINARY column_name = {0}”, value);
方案 2:修改数据库 Collation
如果你可以修改数据库,建议将 Collation 改为 区分大小写 的方式,例如:
ALTER TABLE your_table MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;
或者:
ALTER DATABASE your_db DEFAULT COLLATE utf8_bin;
方案 3:使用 collate 强制查询大小写
如果不想修改表结构,可以在 SQL 查询中加上 COLLATE utf8_bin:
queryWrapper.apply(“column_name COLLATE utf8_bin = {0}”, value);
方案 4:手动转换大小写(不推荐)
如果不介意性能损失,可以使用 LOWER() 或 UPPER() 让两边统一:
queryWrapper.eq(“LOWER(column_name)”, value.toLowerCase());
但这会影响索引优化,因此 不推荐。