你們在使用mysql過程當中,可能會遇到相似如下的問題:前端
模糊匹配 jg%,結果以JG開頭的字符串也出如今結果集中,你們很天然的認爲是大小寫敏感的問題。那麼mysql中大小寫敏感是如何控制的;數據庫名,表名,字段名這些字典對象以及字段值的大小敏感是如何控制的;以及校驗規則與索引的關係,這是本文要討論的內容。java
數據庫名、表名:python
windows建庫:mysql
windows建表:linux
linux建庫:面試
linux建表:spring
以上能夠看出windows下大小寫不敏感,linux下是敏感的,故前者不能夠同時建test和TEST,然後者能夠。sql
Linux下:數據庫
數據庫名與表名是嚴格區分大小寫的;編程
Windows下:
Mac OS下,文件系統類型HFS+,非UFS卷:
mysql中控制數據庫名和表名的大小寫敏感由參數lower_case_table_names控制,爲0時表示區分大小寫,爲1時,表示將名字轉化爲小寫後存儲,不區分大小寫。
在mysql中,數據庫對應數據目錄中的目錄。數據庫中的每一個表至少對應數據庫目錄中的一個文件(也多是多個,取決於存儲引擎)。所以,所使用操做系統的大小寫敏感性決定了數據庫名和表名的大小寫敏感性。
lower_case_file_system:
變量說明是否數據目錄所在的文件系統對文件名的大小寫敏感。ON說明對文件名的大小寫不敏感,OFF表示敏感。
lower_case_table_names:
unix下默認值爲 0 ;Windows下默認值是 1 ;Mac OS X下默認值是 2
0:使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母在硬盤上保存表名和數據庫名。名稱比較對大小寫敏感。在大小寫不敏感的操做系統如windows或Mac OS x上咱們不能將該參數設爲0,若是在大小寫不敏感的文件系統上將此參數強制設爲0,而且使用不一樣的大小寫訪問MyISAM表名,可能會致使索引破壞。
1:表名在硬盤上以小寫保存,名稱比較對大小寫不敏感。MySQL將全部表名轉換爲小寫在存儲和查找表上。該行爲也適合數據庫名和表的別名。該值爲Windows的默認值。
2:表名和數據庫名在硬盤上使用CREATE TABLE或CREATE DATABASE語句指定的大小寫字母進行保存,但MySQL將它們轉換爲小寫在查找表上。名稱比較對大小寫不敏感,即按照大小寫來保存,按照小寫來比較。註釋:只在對大小寫不敏感的文件系統上適用innodb表名用小寫保存。
windows上:
linux上:
爲了不大小寫引起的問題,一種推薦的命名規則是:在定義數據庫、表、列的時候所有采用小寫字母加下劃線的方式,不使用任何大寫字母。
字段名和字段值:
字段名一般都是不區分大小寫的。
字段值的大小寫由mysql的校對規則來控制。提到校對規則,就不得不說字符集。字符集是一套符號和編碼,校對規則是在字符集內用於比較字符的一套規則,好比定義'A'<'B'這樣的關係的規則。不一樣的字符集有多種校對規則,通常而言,校對規則以其相關的字符集名開始,一般包括一個語言名,而且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束 。好比 utf8字符集,utf8_general_ci,表示不區分大小寫,這個是utf8字符集默認的校對規則;utf8_general_cs表示區分大小寫,utf8_bin表示二進制比較,一樣也區分大小寫。
校對規則經過關鍵字collate指定,好比建立數據庫test2,指定字符集爲utf8,校對規則爲utf8_bin
create database test2 default character set utf8 collate utf8_bin;
經過上述語句說明數據庫test2中的數據按utf8編碼,而且是對大小寫敏感的。
有時候咱們建庫時,沒有指定校對規則校對時字符大小寫敏感,可是咱們查詢時,又須要對字符比較大小寫敏感,就好比開篇中的例子,只想要jg開頭的字符串。不要緊,mysql提供了collate語法,經過指定utf8_bin校對規則便可。
還有另一種方法,經過binary關鍵字,將串轉爲二進制進行比較,因爲大小寫字符的二進制確定不一樣,所以能夠認爲是區分大小的一種方式。
校對規則與索引存儲的關係。由於校對規則會用於字符串之間比較,而索引是基於比較有序排列的,所以校對規則會影響記錄的索引順序。下面舉一個小例子說明:
建表: create table test3(name varchar(100), primary key(name)); create table test4(name varchar(100), primary key(name)) collate utf8_bin; 給表test3插入數據: insert into test3(name) values('abc'); insert into test3(name) values('ABD'); insert into test3(name) values('ZBC'); 給表test4插入數據: insert into test4(name) values('abc'); insert into test4(name) values('ABD'); insert into test4(name) values('ZBC'); 查表: select * from test3; select * from test4;
從結果能夠看到test3和test4返回的結果集中,記錄的相對順序是不一樣的,由於是全表掃描,返回的記錄體現了主鍵順序。因爲test3表校驗規則採用默認的utf8_general_ci,大小寫不敏感,所以abc<ABC<ZBC;同理,test4採用utf8_bin,大小寫敏感,所以ABD<ZBC<abc。
關於mysql相關海量教程能夠關注文末公衆號回覆【1】加助手微信索取。
本公衆號免費提供csdn下載服務,海量IT學習資源,若是你準備入IT坑,勵志成爲優秀的程序猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時咱們組建了一個技術交流羣,裏面有不少大佬,會不定時分享技術文章,若是你想來一塊兒學習提升,能夠公衆號後臺回覆【2】,免費邀請加技術交流羣互相學習提升,會不按期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你