引言
被舍友問了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.