MySQL大小寫敏感的解決方案
一、MySQL大小寫敏感的控制
mysql是通過lower_case_table_names引數來控制大小寫敏感的,該引數在[mysqld]結點下。具體的含義筆者從官網截了一張圖。
注:
①關於lower_case_table_names引數對表名稱或資料庫名稱大小寫敏感的控制。
② Unix下預設為0,也就是大小寫敏感的;Windows下預設為1,不敏感;macOS預設為2,儲存區分大小寫,但是在查詢時會轉換為小寫。
③ 對於在大小寫不敏感的系統(Windows和macOS)不能將該欄位設定為0。
二、出現的問題
#1.Linux下預設lower_case_table_names=0,對錶明的大小寫是敏感的。注:筆者資料版本為5.7.22。
注:lower_case_file_system:OFF表示大小寫敏感,ON表示大小寫不敏感。lower_case_table_names:0表示敏感,1表示不敏感。
#2.具體演示。
注:建立test表,並插入一條資料。
Case 1:
分析:
對比兩組查詢,可以知linux下,mysql預設對錶名大小寫敏感。
Case 2:
分析:
利用‘Aa’和‘aa’查詢出相同的結果,說明查詢時對欄位內容進行了轉換(大寫轉換成小寫),造成了這一現象。
Case 3:
分析:
在查詢時,對欄位‘Name'也可查詢結果,表明在查詢時對欄位的大小寫不敏感。
綜合以上幾個Case可得出如下結論:
① linux預設情況下,對資料庫名和表名的大小寫是敏感的,因為linux系統本身對大小寫就敏感。
②欄位內容大小寫不敏感。
③列名大小寫不敏感。
對於上述出現的問題,對實際的業務還是有相應影響的,因此應尋找對應的解決方案。
三、欄位內容及列名大小寫不敏感的解決方案
① 建立表時,將欄位標記為binary,二進位制大小寫是敏感的。
② 在查詢條件的欄位前加binary,但是不建議這麼做,因為會使欄位索引失效。
③ 建表時設定校對規則(collate)。
collate規則:
*_bin: 表示的是binary case sensitive collation,也就是說是區分大小寫
*_ci: case insensitive collation,不區分大小寫。
④ 如果建表時校對規則未用*_bin,則可直接修改欄位的屬性。
alter table test3 modify name varchar(20) collate utf8_bin;
四、總結
只要在建立表的時候指定collate為utf8_bin,就可以實現大小寫敏感,如果建表時未指定,則可修改欄位的校對規則,也可以實現大小寫敏感。