1. 程式人生 > 實用技巧 >MySQL大小寫敏感的解決方案

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,就可以實現大小寫敏感,如果建表時未指定,則可修改欄位的校對規則,也可以實現大小寫敏感。

轉自:https://www.cnblogs.com/developer_chan/p/9247674.html