MySQL大小寫敏感的解決方案


前言:對於MySQL的大小寫敏感的影響,筆者在一個小項目中深刻的體會到:當想要查詢一條數據時,總是出來兩條或多條,后來發現是大小寫敏感造成的原因,本文就該問題提出解決方案。


1.MySQL大小寫敏感的控制

mysql是通過lower_case_table_names參數來控制大小寫敏感的,該參數在[mysqld]結點下。具體的含義筆者從官網截了一張圖。

注:

①關於lower_case_table_names參數對表名稱或數據庫名稱大小寫敏感的控制。

②Unix下默認為0,也就是大小寫敏感的;Windows下默認為1,不敏感;macOS默認為2,存儲區分大小寫,但是在查詢時會轉換為小寫。

③對於在大小寫不敏感的系統(Windows和macOS)不能將該字段設置為0。

2.出現的問題

#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系統本身對大小寫就敏感。

字段內容大小寫不敏感。

列名大小寫不敏感。

對於上述出現的問題,對實際的業務還是有相應影響的,因此應尋找對應的解決方案。

3.字段內容及列名大小寫不敏感的解決方案

①創建表時,將字段標記為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,就可以實現大小寫敏感,如果建表時未指定,則可修改字段的校對規則,也可以實現大小寫敏感。


by Shawn Chen,2018.7.2日,下午。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM