聊一聊MySQL的字符集

KunlunDB發表於2022-01-24

一、字符集概述

 

字符集(Character Set)是多個字元的集合,字符集種類較多,每個字符集包含的字元個數不同,常見字符集名稱:ASCII、GB2312、BIG5、Unicode等。


UTF(Unicode Tranformation Format)是Unicode的其中一個使用方式,即把Unicode轉做某種格式的意思,包括UTF-8,UTF-16,UTF-32。


UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。


UTF-8用1到6個位元組編碼Unicode字元。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。


UTF-16使用一個或兩個未分配的16位程式碼單元的序列對Unicode程式碼點進行編碼。


UTF-32即將每一個Unicode程式碼點表示為相同值的32位整數。


下面是UTF-8的編碼方式:

二、MySQL的字符集


MySQL的字符集包括字符集(charset)和校對規則(collation)兩個概念。


字符集定義了儲存字串的方式,校對規則定義了比較字串的方式。


MySQL8.0支援40多種字符集的270多種校對規則。


可以使用以下指令,來檢視MySQL系統支援的字符集和校對規則。如下:

MySQL8.0之前建立表不指定字符集的話,預設採用latin1字符集,MySQL8.0之後版本才改為預設utf8mb4(most bytes 4)字符集, 崑崙資料庫儲存節點採用的是MySQL8.0架構,當然也是預設utf8mb4。


UTF-8,在MySQL中寫作utf8,真的有所不同。


MySQL從4.1版本開始支援utf8。可能當時的utf8還沒有定義4-6個位元組標準,或者MySQL設計者認為1-3個位元組的utf8已經夠用了。


所以當時MySQL設計的utf8只支援1-3個位元組的編碼,不是完整的utf8,這種編碼方式一直保留至今。


雖然在MySQL在5.5.3之後增加了utf8mb4字符集,但一段時間開發人員都習慣採用utf8等字符集來支援中文。


MySQL的utf8會導致一些4個位元組編碼的生僻漢字插入錯誤。


還有現在APP端的emoji表情是4個位元組的字元,如果不轉碼,直接更新到資料庫也會報出異常。


歷史原因導致MySQL的utf8經常讓人誤解,曾經讓很多開發人員吃了苦頭,網上有些文章比如:“永遠不要在MySQL中使用utf8”,看著都挺嚇人。


當然過個幾年4個位元組的utf8mb4編碼可能又不夠用了,那MySQL又要增加utf8mb5、utf8mb6。


字元除了需要儲存,還需要排序或比較大小,涉及與字符集相對應的校對規則。在MySQL8.0中檢視一下utf8mb4對應的校對規則:

    utf8mb4的校對規則預設utf8mb4_0900_ai_ci。其中0900表示Unicode版本9.0.0,字尾含義如下表:


    三、舉例來解釋一下MySQL的utf8字符集


    建立兩張表,分別為utf8和utf8mb4字符集:

      插入資料:

        檢視一下表格資料,以及佔用空間:

          可以看出utf8字符集中,一般的漢字佔用3個位元組,英文和數字佔1個位元組。

           

          接下來試下4個位元組的emoji表情包:  


          聊一聊MySQL的字符集

          插入4個位元組的emoji表情包失敗了。


          因為大部分SSH工具不支援4位元組的UTF-8字元顯示,筆者是直接在Ubuntu20系統的Terminal做的演示。4位元組的生僻漢字暫時找不到支援的終端介面,這裡就不演示了。

           

          我們在支援4個位元組的utf8mb4表格中插入emoji表情包,並檢視一下資料,以及佔用空間:


          聊一聊MySQL的字符集

           

          最後我們來看看校驗規則,在tb_utf8mb4中插入一些資料:

            檢視一下資料,三個記錄都出來了:

             

            這種校對規則,對於網址,郵箱地址等不區分大小寫的場景十分好用,但如果我們需要區分大小寫,可以修改一下校對規則:


              再檢視一下資料,這回只有一條記錄滿足:

                MySQL的字符集就聊到這裡了,下一篇帶來MySQL的儲存引擎相關內容~


                -END-


                來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2853738/,如需轉載,請註明出處,否則將追究法律責任。

                相關文章