转载

JPA 大小写敏感问题

引言

JPA 大小写敏感问题

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

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

探究

尝试

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

JPA 大小写敏感问题

数据表中加了一条数据,用户名是 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 的官方文档,根据 JPA 官方的说明来看,规范里设计的是查询是区分大小写的。

默认区分大小写,如果不想区分大小写使用 IgnoreCase 关键字。

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

JPA 大小写敏感问题

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

尝试解决

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

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

collation [kəˈleɪʃn]

JPA 大小写敏感问题

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

ci: case insensitive, a is equal to A.

那是不是改成 utf8_general_cs 问题就解决了呢?

JPA 大小写敏感问题

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

JPA 大小写敏感问题

因为 utf8 是包含所有语言,针对不同语言的大小比较处理十分困难,遂被 mysql 抛弃。

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

总结

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

ci: case insensitive, a is equal to A.

原文  https://segmentfault.com/a/1190000020734621
正文到此结束
Loading...