被舍友問了JPA
的查詢問題,問題問的我一臉懵逼。java
天真的我順手搭了一個小的JPA
項目試一試。mysql
測試環境:spring-boot 2.1.5.RELEASE
、mysql 5.6
。spring
數據表中加了一條數據,用戶名是admin
。sql
測試代碼以下:數據庫
@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
二者都有值,說明查詢的時候未區分大小寫。測試
打開JPA
的官方文檔,根據JPA
官方的說明來看,規範裏設計的是查詢是區分大小寫的。spa
默認區分大小寫,若是不想區分大小寫使用IgnoreCase
關鍵字。設計
問題出在MySQL
上,通過查閱與請教,是MySQL
不區分大小寫。code
用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.