JPA 大小寫敏感問題

引言

image.png

被舍友問了JPA的查詢問題,問題問的我一臉懵逼。

天真的我順手搭了一個小的JPA項目試一試。

探究

嘗試

測試環境:spring-boot 2.1.5.RELEASEmysql 5.6

image.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,說明區分大小寫。

image.png

兩者都有值,說明查詢的時候未區分大小寫。

根源

打開JPA的官方文檔,根據JPA官方的說明來看,規範裏設計的是查詢是區分大小寫的。

默認區分大小寫,如果不想區分大小寫使用IgnoreCase關鍵字。

問題出在MySQL上,經過查閱與請教,是MySQL不區分大小寫。

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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章