引言
被舍友问了JPA
的查询问题,问题问的我一脸懵逼。
天真的我顺手搭了一个小的JPA
项目试一试。
探究
尝试
测试环境:spring-boot 2.1.5.RELEASE
、mysql 5.6
。
数据表中加了一条数据,用户名是admin
。
测试代码如下:
@Test
public void test() {
Teacher teacher1 = teacherRepository.findByUsername("ADMIN");
Teacher teacher2 = teacherRepository.findByUsername("admin");
System.out.println(teacher1);
System.out.println(teacher2);
}
如果teacher1
有值的话,说明查询不区分大小写,如果为null
,说明区分大小写。
两者都有值,说明查询的时候未区分大小写。
根源
打开JPA
的官方文档,根据JPA
官方的说明来看,规范里设计的是查询是区分大小写的。
默认区分大小写,如果不想区分大小写使用IgnoreCase
关键字。
问题出在MySQL
上,经过查阅与请教,是MySQL
不区分大小写。
用ADMIN
去MySQL
里查,也是能查出的数据,与JPA
无关。
尝试解决
毕竟生产环境的项目跑着呢,和舍友讨论了讨论觉得用户名的大小写不敏感应该造成不了什么危害。
但是遇到问题就得解决,经过多方参考,发现是mysql
中collation
的配置问题。
collation [kəˈleɪʃn]
我们建立数据库时都会选择utf8_general_ci
,这个collation
决定了大小写不敏感。
ci: case insensitive, a is equal to A.
cs: case sensitive, a is not equal to A.
那是不是改成utf8_general_cs
问题就解决了呢?
对不起,cs
已经被mysql
废弃了,没有一个cs
的选项。
因为utf8
是包含所有语言,针对不同语言的大小比较处理十分困难,遂被mysql
抛弃。
既然官方都这么说了,那还纠结大小写干啥呢?
总结
最精髓的就是这两个关键字,请大家务必记住!
ci: case insensitive, a is equal to A.
cs: case sensitive, a is not equal to A.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。