Bootstrap

解决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中,解决查询不区分大小写的两种方式

;