您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL中varchar的大小寫字符比較”,在日常操作中,相信很多人在MySQL中varchar的大小寫字符比較問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL中varchar的大小寫字符比較”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
背景:
程序某日提出的SQL問題, 發現比較varchar字符串內容的時候, 大小寫不敏感;
測試環境還原問題, 環境構造如下:
create table case_sen(id int primary key, name varchar(32)notnull);
insert into case_sen values(1,'LucyLoveLily');
insert into case_sen values(2,'lucylovelily');
insert into case_sen values(3,'TomHateLarry');
insert into case_sen values(4,'tomhatelarry');
效果如下:
實際上程序希望只有id=1的匹配到,
同樣的問題也出現在like里面:
程序有問是不是lower_case_table_names的問題, 顯然.........不是 _(:з」∠)_
場景:
MySQL-5.7進行的還原, 實際上這個問題和版本沒有關系;
分析:
首先可以確認的是, 表內的數據并沒有問題, 該大寫的還是大寫, 該小寫的還是小寫;
那么問題最有可能出在MySQL的運算符"="和like上, 這兩類運算的原理可能因為某些原因/設置/導致不進行大小寫區分;
排查方向定下來以后, 試著用關鍵字comparison, case sensitive在文檔里面找找, 發現有一個章節提到了這個問題,并給出了一些示例;
PS: 章節名 B.5.4.1 Case Sensitivity in String Searches
文檔示例如圖:
對文檔的描述進行歸納: 非binary類型的string進行邏輯運算時, 會依據collate的配置來計算結果;
所以如果collate的設置對大小寫不敏感, 那么就會出現測試環境中的效果;
那么問題來了, utf8mb4的默認collate是什么?
發現是utf8mb4_general_ci, 通過對文檔內容的分析, 這個后綴ci代表的意思應該就是case-insensitive ;
那么試著換一下字符集的collate, 看看是不是能區分大小寫;
Bingo~~~
當然, 在列上面指定collate為utf8mb4_bin也可以達到一樣的目的;
PS: mysql的所有字符集默認都使用XXX_general_ci, 而有的字符集會有XXX_general_cs, 但是utf8是沒有的, 所以要使用utf8_bin;
PPS: 興趣閱讀: https://www.percona.com/live/europe-amsterdam-2015/sites/default/files/slides/PL_AMS_Unicode_Booking169_v3.pdf
PS: 注意索引喲, 5.7是可以的, <5.7可沒有試過 ╰(*°▽°*)╯
到此,關于“MySQL中varchar的大小寫字符比較”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。