溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中varchar的大小寫字符比較

發(fā)布時(shí)間:2021-08-24 17:37:08 來源:億速云 閱讀:277 作者:chen 欄目:MySQL數(shù)據(jù)庫

這篇文章主要介紹“MySQL中varchar的大小寫字符比較”,在日常操作中,相信很多人在MySQL中varchar的大小寫字符比較問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL中varchar的大小寫字符比較”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!


背景:
程序某日提出的SQL問題, 發(fā)現(xiàn)比較varchar字符串內(nèi)容的時(shí)候, 大小寫不敏感;
測試環(huán)境還原問題, 環(huán)境構(gòu)造如下:

  1. create table case_sen(id int primary key, name varchar(32)notnull);

  2. insert into case_sen values(1,'LucyLoveLily');

  3. insert into case_sen values(2,'lucylovelily');

  4. insert into case_sen values(3,'TomHateLarry');

  5. insert into case_sen values(4,'tomhatelarry');


效果如下:
MySQL中varchar的大小寫字符比較

實(shí)際上程序希望只有id=1的匹配到,  
同樣的問題也出現(xiàn)在like里面:
MySQL中varchar的大小寫字符比較

程序有問是不是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

文檔示例如圖:
MySQL中varchar的大小寫字符比較

對文檔的描述進(jìn)行歸納:  非binary類型的string進(jìn)行邏輯運(yùn)算時(shí), 會依據(jù)collate的配置來計(jì)算結(jié)果;

所以如果collate的設(shè)置對大小寫不敏感, 那么就會出現(xiàn)測試環(huán)境中的效果;

那么問題來了, utf8mb4的默認(rèn)collate是什么?
MySQL中varchar的大小寫字符比較

發(fā)現(xiàn)是utf8mb4_general_ci, 通過對文檔內(nèi)容的分析, 這個后綴ci代表的意思應(yīng)該就是case-insensitive ;

那么試著換一下字符集的collate, 看看是不是能區(qū)分大小寫;
MySQL中varchar的大小寫字符比較

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可沒有試過 ╰(*°▽°*)╯
MySQL中varchar的大小寫字符比較

到此,關(guān)于“MySQL中varchar的大小寫字符比較”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI