博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql忽略大小写jpa解决_JPA 大小写敏感问题
阅读量:1523 次
发布时间:2019-04-21

本文共 1021 字,大约阅读时间需要 3 分钟。

引言

066d32351cf17eca4f675a80a797e5f4.png

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

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

探究

尝试

测试环境:spring-boot 2.1.5.RELEASE、mysql 5.6。

a305574c24e211cc50d5d1dd1c543ad5.png

数据表中加了一条数据,用户名是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,说明区分大小写。

ff0af7db0d41ca6083a2a9664decffd5.png

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

根源

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

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

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

becbfce95573033d06e406eba9c986a8.png

用ADMIN去MySQL里查,也是能查出的数据,与JPA无关。

尝试解决

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

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

collation [kəˈleɪʃn]

3cef5a9cba8ba5e6b9f6e333f91ec515.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问题就解决了呢?

515e5e0f4abb03605c3cec9789b42804.png

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

8655cd5ea861e36c530e9f5cc347d3d6.png

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

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

总结

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

ci: case insensitive, a is equal to A.

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

转载地址:http://glnby.baihongyu.com/

你可能感兴趣的文章
AcWing - 数的三次方根(二分)
查看>>
AcWing - 高精度加法(大数加法)
查看>>
AcWing - 高精度减法(大数减法)
查看>>
AcWing - 高精度乘法(大数乘法)
查看>>
AcWing - 高精度除法(大数除法)
查看>>
AcWing - 前缀和(前缀和)
查看>>
AcWing - 子矩阵的和(二维前缀和)
查看>>
AcWing - 差分(一维差分)
查看>>
AcWing - 最长连续不重复子序列(双指针)
查看>>
AcWing - 数组元素的目标和(双指针)
查看>>
AcWing - 区间和(离散化&前缀和)
查看>>
AcWing - 区间合并(贪心)
查看>>
AcWing - 单链表(模拟)
查看>>
AcWing - 双链表(模拟)
查看>>
AcWing - KMP字符串(KMP)
查看>>
来一个总结吧
查看>>
有趣的句子
查看>>
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
查看>>
Scrapy(6)Item loader 加载器详解
查看>>
每日一道python面试题 - Python的实例,类和静态方法揭秘
查看>>