MySQL查询不区分大小写的两种解决方式
作者:何中应
偶然机会,发现一次查询匹配数据的时候没有区分大小写,如,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中,解决查询不区分大小写的两种方式
到此这篇关于MySQL查询不区分大小写的两种解决方式的文章就介绍到这了,更多相关MySQL查询不区分大小写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!