您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL中varchar的大小寫字符比較”,在日常操作中,相信很多人在MySQL中varchar的大小寫字符比較問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL中varchar的大小寫字符比較”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
背景:
程序某日提出的SQL問題, 發(fā)現(xiàn)比較varchar字符串內(nèi)容的時(shí)候, 大小寫不敏感;
測試環(huán)境還原問題, 環(huán)境構(gòu)造如下:
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');
效果如下:
實(shí)際上程序希望只有id=1的匹配到,
同樣的問題也出現(xiàn)在like里面:
程序有問是不是lower_case_table_names的問題, 顯然.........不是 _(:з」∠)_
場景:
MySQL-5.7進(jìn)行的還原, 實(shí)際上這個問題和版本沒有關(guān)系;
分析:
首先可以確認(rèn)的是, 表內(nèi)的數(shù)據(jù)并沒有問題, 該大寫的還是大寫, 該小寫的還是小寫;
那么問題最有可能出在MySQL的運(yùn)算符"="和like上, 這兩類運(yùn)算的原理可能因?yàn)槟承┰?設(shè)置/導(dǎo)致不進(jìn)行大小寫區(qū)分;
排查方向定下來以后, 試著用關(guān)鍵字comparison, case sensitive在文檔里面找找, 發(fā)現(xiàn)有一個章節(jié)提到了這個問題,并給出了一些示例;
PS: 章節(jié)名 B.5.4.1 Case Sensitivity in String Searches
文檔示例如圖:
對文檔的描述進(jìn)行歸納: 非binary類型的string進(jìn)行邏輯運(yùn)算時(shí), 會依據(jù)collate的配置來計(jì)算結(jié)果;
所以如果collate的設(shè)置對大小寫不敏感, 那么就會出現(xiàn)測試環(huán)境中的效果;
那么問題來了, utf8mb4的默認(rèn)collate是什么?
發(fā)現(xiàn)是utf8mb4_general_ci, 通過對文檔內(nèi)容的分析, 這個后綴ci代表的意思應(yīng)該就是case-insensitive ;
那么試著換一下字符集的collate, 看看是不是能區(qū)分大小寫;
Bingo~~~
當(dāng)然, 在列上面指定collate為utf8mb4_bin也可以達(dá)到一樣的目的;
PS: mysql的所有字符集默認(rèn)都使用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可沒有試過 ╰(*°▽°*)╯
到此,關(guān)于“MySQL中varchar的大小寫字符比較”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。