说明:偶然机会,发现一次查询匹配数据的时候没有区分大小写,如,username = ‘WangWu’,username = 'wangwu’的记录也被查出来。本文介绍解决这种情况的两种方式;
场景
场景如下,一个简单的查询语句;
(mapper方法)
@Select("select * from tb_demo where username = #{username} ")
DemoDTO selectByUsername(String username);
(单元测试)
@Test
public void testSelectByUsername() {
String username = "WangWu";
DemoDTO demoDTO = demoMapper.selectByUsername(username);
System.out.println(demoDTO);
}
数据库数据,如下:
查询结果,没有区分大小写,wangwu的记录被查出来了;
解决
解决方式有两种,如下:
方法一:更换数据库字符集
在前面的demo中,数据库字符集是:utf8mb4_general_ci,表的字符集:utf8mb4_general_ci,ci,意思是case insensitive,大小写不敏感,不区分大小写。
可以考虑更改为 utf8mb4_bin,但是博主尝试修改现有数据库的字符集,还是不行,只有在创建表的时候就指定才行。故在以后创建数据库选定字符集时,需考虑业务是否有区分大小写的场景。
方法二:修改SQL
可以在SQL中,指定字符集比较。像上面的SQL,修改如下:
@Select("select * from tb_demo where username = #{username} COLLATE utf8mb4_bin")
DemoDTO selectByUsername(String username);
指定用 utf8mb4_bin字符集比较,就能区分大小写了,如下:
@Test
public void testSelectByUsername() {
DemoDTO demoDTO1 = demoMapper.selectByUsername("WangWu");
System.out.println("demoDTO1 = " + demoDTO1);
DemoDTO demoDTO2 = demoMapper.selectByUsername("wangwu");
System.out.println("demoDTO2 = " + demoDTO2);
}
查询结果:
总结
本文介绍了在MySQL中,解决查询不区分大小写的两种方式