<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫話:如何給女朋友解釋為什么不能在MySQL中使用UTF-8編碼

          共 3103字,需瀏覽 7分鐘

           ·

          2021-05-15 05:42

          MySQL是一種關(guān)系型數(shù)據(jù)庫,這個大家肯定都不陌生,使用MySQL創(chuàng)建數(shù)據(jù)庫的時候,大家需要指定一種編碼方式。

          很多時候,大家基于自己對編碼方式的了解,會認(rèn)為UTF-8是一種通用的編碼方式,所以大多數(shù)時候會默認(rèn)選擇這種編碼方式。

          但是,這往往會給你的數(shù)據(jù)庫埋下一個大坑!!!

          MySQL對Unicode的支持

          Unicode字符集,他現(xiàn)在已經(jīng)是計算機(jī)科學(xué)領(lǐng)域里的一項業(yè)界標(biāo)準(zhǔn),它對世界上大部分的文字系統(tǒng)進(jìn)行了整理、編碼,使得計算機(jī)可以用更為簡單的方式來呈現(xiàn)和處理文字。

          為了適應(yīng)不同的數(shù)據(jù)存儲和傳遞需求,人們提出了 Unicode Transformation Format(UTF)系列編碼。這其中包含UTF-8、UTF-16、UTF-32等。

          通過查閱MySQL官方文檔(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html ),我們可以知道,在MySQL中,主要支持以下字符集:utf8、ucs2、utf8mb3、utf8mb4、utf16、utf16le和utf32

          不同的字符集的區(qū)別在于包含的字符情況以及存儲需要的空間。

          字符集支持的字符每個字符所需存儲空間
          utf8mb3, utf8BMP1-3 字節(jié)
          ucs2BMP2 字節(jié)
          utf8mb4BMP和補(bǔ)充字符1-4 字節(jié)
          utf16BMP和補(bǔ)充字符2或4 字節(jié)
          utf16leBMP和補(bǔ)充字符2或4 字節(jié)
          utf32BMP和補(bǔ)充字符4 字節(jié)

          在MySQL官方文檔中,介紹了支持的編碼方式之后,還有一段醒目的提醒:

          翻譯過來是:utf8mb3字符集已被棄用,它在未來的MySQL版本中將會被刪除,請使用utf8mb4代替。在目前的8.0版本中,utf8指的就是utf8mb3,雖然未來可能改成utf8mb4,但是為了避免產(chǎn)生歧義,可以考慮為字符集引用顯式指定utf8mb4,而不是utf8。

          也就是說,當(dāng)我們在MySQL 8.0 中指定字符編碼方式為UTF-8的時候,其實使用的是utf8mb3這種編碼方式。

          那么,我們先來說說utf8mb3。

          utf8mb3

          utf8mb3字符集是MySQL早期就支持的字符集,他具有以下特征:

          1、僅支持BMP字符(不支持補(bǔ)充字符)

          2、每個多字節(jié)字符最多需要三個字節(jié)

          注意,僅支持BMP字符,那么什么是BMP字符呢?

          BMP是Basic Multilingual Plane的縮寫,即碼位在0到65535之間(或者U+0000和U+FFFF)的字符。

          BMP中并不包含補(bǔ)充字符,即碼位在U+10000和U+10FFFF之間的的字符。補(bǔ)充字符有哪些呢,如一些生僻的漢字,或者Emoji 表情等都是補(bǔ)充字符。

          也就是說,如果在建表的時候,指定的編碼方式是utf8mb3(utf-8),那么對于一些生僻字或者emoji表情都無法表示。

          utf8mb4

          早期的時候,Unicode 只用到了 0~0xFFFF 范圍的數(shù)字編碼,這就是 BMP 字符集。所以,最初MySQL在設(shè)計之初,也就只涉及了包含BMP 字符集的utfmb3(utf-8),但是隨著文字越來越多,3個字節(jié)肯定無法全部表示,于是Unicode支持的字符就更多了。

          所以,早期的utfmb3在有些場景中就不能滿足需求了,于是,MySQL在5.5.3之后增加了utf8mb4的編碼。

          utfmb4字符集具有以下特征:

          1、支持BMP和補(bǔ)充字符。

          2、每個多字節(jié)字符最多需要4個字節(jié)。

          utf8mb4與utf8mb3字符集不同,utf8mb3字符集只支持BMP字符,每個字符最多使用三個字節(jié):

          對于BMP字符,utf8mb4和utf8mb3具有相同的存儲特征,即相同的編碼值,相同的編碼,相同的長度。

          對于補(bǔ)充字符,utf8mb4需要4個字節(jié)來存儲它,而utf8mb3根本不能存儲該字符。所以我們說utf8mb4是utf8mb3的超集。

          所以,很多時候,為了考慮到兼容性,建議創(chuàng)建MySQL表的時候,使用utf8mb4,而不是utf8!

          utf8mb3和utf8mb4區(qū)別及優(yōu)缺點

          前面分別介紹了utf8mb3和utf8mb4字符集,他們的區(qū)別如下:

          utf8mb3只支持BMP (Basic Multilingual Plane)的字符。utf8mb4還支持BMP之外的補(bǔ)充字符。

          utf8mb3每個字符最多使用3個字節(jié)。Utf8mb4每個字符最多使用4個字節(jié)。

          utf8mb4比utf8mb3來說,他能表示更多的補(bǔ)充字符,但是同時占用的空間可能會更大一些。

          從utf8mb3轉(zhuǎn)換成utf8mb4

          首先,想要把字符集從utf8mb3轉(zhuǎn)換到utf8mb4,其實是問題不大的:

          對于BMP字符,utf8mb4和utf8mb3具有相同的存儲特征:相同的編碼值,相同的編碼,相同的長度。

          對于補(bǔ)充字符,utf8mb4需要4個字節(jié)來存儲它,而utf8mb3根本不能存儲該字符。當(dāng)將utf8mb3列轉(zhuǎn)換為utf8mb4時,您不必?fù)?dān)心轉(zhuǎn)換補(bǔ)充字符,因為沒有補(bǔ)充字符。

          假設(shè)有一張已知表使用了utf8mb3:

          CREATE TABLE t1 (
            col1 CHAR(10CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
            col2 CHAR(10CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
          CHARACTER SET utf8;

          下面的語句將t1轉(zhuǎn)換為utf8mb4:

          ALTER TABLE t1
            DEFAULT CHARACTER SET utf8mb4,
            MODIFY col1 CHAR(10)
              CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
            MODIFY col2 CHAR(10)
              CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;

          關(guān)于作者漫話編程,是一個通過漫畫+音頻的形式講解枯燥的編程知識的公眾號。致力于讓編程變得更有樂趣。


          推薦閱讀:


          喜歡我可以給我設(shè)為星標(biāo)哦

          好文章,我“在看”
          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青草视频在线免费观看 | 台湾 成人 国产 | 台湾在线无码视频 | 国产99视频精品免视看10 | 一级黄色淫秽视频免费观看 |