日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

utf8mb4 和 utf8 是 MySQL 中兩種常用的字符集,它們都可以用來存儲 Unicode 字符,但是有一些區別和聯系。本文將從以下幾個方面對比 utf8mb4 和 utf8:

編碼范圍和存儲空間

utf8 是 MySQL 中最早支持的 Unicode 字符集,它使用 1 到 3 個字節來編碼每個字符,最大能表示的 Unicode 碼點是 U+FFFF,也就是 Unicode 的基本多文種平面(BMP)。這意味著 utf8 不能存儲一些超出 BMP 的字符,例如 Emoji 表情、部分罕用漢字、新增的 Unicode 字符等。這些字符需要 4 個字節來編碼,所以 utf8 會在遇到這些字符時報錯或者出現亂碼。

utf8mb4 是 MySQL 在 5.5.3 版本之后增加的一個新的字符集,它是 utf8 的超集,也就是說 utf8 可以表示的字符 utf8mb4 都可以表示,而且 utf8mb4 還可以表示一些 utf8 不能表示的字符。utf8mb4 使用 1 到 4 個字節來編碼每個字符,最大能表示的 Unicode 碼點是 U+10FFFF,也就是 Unicode 的所有 17 個平面。這意味著 utf8mb4 可以存儲任何合法的 Unicode 字符,包括 Emoji 表情、部分罕用漢字、新增的 Unicode 字符等。

由于 utf8mb4 可以使用 4 個字節來編碼字符,所以它占用的存儲空間會比 utf8 略大一些。例如,一個 CHAR(10) 類型的字段,如果使用 utf8 字符集,那么它需要保留 10 * 3 = 30 個字節的空間;如果使用 utf8mb4 字符集,那么它需要保留 10 * 4 = 40 個字節的空間。對于 VARCHAR 類型的字段,如果使用 utf8 字符集,那么它需要額外使用一個字節來記錄字符串的長度;如果使用 utf8mb4 字符集,那么它需要額外使用兩個字節來記錄字符串的長度。

排序規則和性能

排序規則(collation)是指在比較和排序字符串時所遵循的規則。不同的字符集可以有不同的排序規則,甚至同一個字符集也可以有多種排序規則。MySQL 中常見的排序規則有以下幾種:

  • _bin:按照二進制方式比較字符串,區分大小寫和重音符號。
  • _general_ci:按照一般方式比較字符串,不區分大小寫和重音符號。
  • _unicode_ci:按照 Unicode 標準方式比較字符串,不區分大小寫和重音符號。
  • _ci:按照特定語言或地區方式比較字符串,不區分大小寫和重音符號。

utf8 和 utf8mb4 都有以上幾種排序規則,但是有一些細微的差別。例如,在 utf8_general_ci 排序規則下,'a' 等于 'A',而在 utf8mb4_general_ci 排序規則下,'a' 小于 'A'。這是因為 utf8_general_ci 排序規則只考慮了 BMP的字符,而 utf8mb4_general_ci 排序規則考慮了所有的 Unicode 字符。因此,在 utf8mb4_general_ci 排序規則下,'a' 的 Unicode 碼點是 U+0061,而 'A' 的 Unicode 碼點是 U+0041,所以 'a' 小于 'A'。

排序規則的不同會影響字符串的比較和排序的結果,進而影響索引的效率和查詢的性能。一般來說,_bin 排序規則的性能最高,因為它只需要按照二進制方式比較字符串,不需要考慮字符的大小寫和重音符號等因素。

_general_ci 排序規則的性能次之,因為它只需要按照一般方式比較字符串,不需要考慮字符的語言或地區等因素。*_unicode_ci 和 *_ci 排序規則的性能最低,因為它們需要按照 Unicode 標準或特定語言或地區的方式比較字符串,需要考慮字符的大小寫和重音符號等因素。

兼容性和安全性

utf8 和 utf8mb4 的兼容性和安全性也有一些區別。由于 utf8mb4 是 utf8 的超集,所以從 utf8 切換到 utf8mb4 一般不會有問題,只需要注意存儲空間的增加和排序規則的變化。但是從 utf8mb4 切換到 utf8 就可能會有問題,因為 utf8mb4 可能包含一些 utf8 不能表示的字符,這些字符在切換后會被丟棄或者轉換成問號等符號。

另外,utf8mb4 也比 utf8 更安全,因為它可以防止一些惡意的攻擊。例如,有一種攻擊叫做 UTF-8 編碼注入攻擊(UTF-8 Encoding Injection Attack),它是利用 MySQL 中 utf8 字符集對 4 字節字符的處理方式來繞過一些安全檢查的。

具體來說,當 MySQL 遇到一個 4 字節的 UTF-8 字符時,它會把它拆分成兩個 2 字節的字符,并且忽略第一個字符。這樣就可能導致一些原本不合法或者不安全的字符串變成合法或者安全的字符串。

例如,假設有一個字符串是 "xF0x90x80xE2x80xAEabc",它實際上包含了一個 4 字節的 UTF-8 字符 U+10400 和一個右至左覆蓋符號 U+202E。如果使用 utf8 字符集來存儲這個字符串,那么 MySQL 會把它拆分成 "xC0x80xE2x80xAEabc",并且忽略第一個字符 "xC0x80"。這樣就相當于把右至左覆蓋符號 U+202E 插入到了字符串中,從而改變了字符串的顯示方向。

這可能會被用來進行釣魚或者欺騙等攻擊。如果使用 utf8mb4 字符集來存儲這個字符串,那么 MySQL 會保留原始的字符串,并且報錯或者出現亂碼。

結論

utf8mb4 和 utf8 都可以用來存儲 Unicode 字符,但是 utf8mb4 支持更廣泛的字符范圍,能夠存儲 Emoji 表情、罕用漢字、新增的 Unicode 字符等。utf8mb4 比 utf8 占用的存儲空間略大一些,但是在性能和安全性方面更優。因此,如果需要支持更廣泛的字符范圍,或者需要更高的安全性和兼容性,那么應該使用 utf8mb4 字符集。當然,在選擇字符集的時候,還需要考慮具體的業務需求和實際情況,選擇最合適的字符集才是最重要的。

分享到:
標簽:utf8
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定