JPA 大小写敏感问题

引言

image.png

被舍友问了JPA的查询问题,问题问的我一脸懵逼。java

天真的我顺手搭了一个小的JPA项目试一试。mysql

探究

尝试

测试环境:spring-boot 2.1.5.RELEASEmysql 5.6spring

image.png

数据表中加了一条数据,用户名是adminsql

测试代码以下:数据库

@Test
public void test() {
    Teacher teacher1 = teacherRepository.findByUsername("ADMIN");
    Teacher teacher2 = teacherRepository.findByUsername("admin");
    System.out.println(teacher1);
    System.out.println(teacher2);
}

若是teacher1有值的话,说明查询不区分大小写,若是为null,说明区分大小写。spring-boot

image.png

二者都有值,说明查询的时候未区分大小写。测试

根源

打开JPA的官方文档,根据JPA官方的说明来看,规范里设计的是查询是区分大小写的。spa

默认区分大小写,若是不想区分大小写使用IgnoreCase关键字。设计

问题出在MySQL上,通过查阅与请教,是MySQL不区分大小写。code

image.png

ADMINMySQL里查,也是能查出的数据,与JPA无关。

尝试解决

毕竟生产环境的项目跑着呢,和舍友讨论了讨论以为用户名的大小写不敏感应该形成不了什么危害。

可是遇到问题就得解决,通过多方参考,发现是mysqlcollation的配置问题。

collation [kəˈleɪʃn]

image.png

咱们创建数据库时都会选择utf8_general_ci,这个collation决定了大小写不敏感。

ci: case insensitive, a is equal to A.
cs: case sensitive, a is not equal to A.

那是否是改为utf8_general_cs问题就解决了呢?

image.png

对不起,cs已经被mysql废弃了,没有一个cs的选项。

image.png

由于utf8是包含全部语言,针对不一样语言的大小比较处理十分困难,遂被mysql抛弃。

既然官方都这么说了,那还纠结大小写干啥呢?

总结

最精髓的就是这两个关键字,请你们务必记住!

ci: case insensitive, a is equal to A. cs: case sensitive, a is not equal to A.
相关文章
相关标签/搜索