mysql的utf8與utf8mb4 異同;utf8mb4_unicode_ci 與 utf8mb4_general_ci 如何選擇

 如圖,通常使用以下配置mysql

utf8mb4是4個字節。utf8是3個字節。utf8mb4兼容性更好,佔用空間更大。算法

 

主要從排序準確性和性能兩方面看:sql

  • 準確性
    utf8mb4_unicode_ci 是基於標準的Unicode來排序和比較,可以在各類語言之間精確排序
    utf8mb4_general_ci 沒有實現Unicode排序規則,在遇到某些特殊語言或字符是,排序結果可能不是所指望的。
    可是在絕大多數狀況下,這種特殊字符的順序必定要那麼精確嗎。好比Unicode把ߌ當成ssOE來看;而general會把它們當成se,再如ÀÁÅåāă各自都與 A 相等。
  • 性能
    utf8mb4_general_ci 在比較和排序的時候更快
    utf8mb4_unicode_ci 在特殊狀況下,Unicode排序規則爲了可以處理特殊字符的狀況,實現了略微複雜的排序算法。
    可是在絕大多數狀況下,不會發生此類複雜比較。general理論上比Unicode可能快些,但相比如今的CPU來講,它遠遠不足以成爲考慮性能的因素,索引涉及、SQL設計纔是。 我我的推薦是 utf8mb4_unicode_ci,未來 8.0 裏也極有可能使用變爲默認的規則。相比選擇哪種collation,使用者應該更關心字符集與排序規則在db裏要統一就好。

這也從另外一個角度告訴咱們,不要可能產生亂碼的字段做爲主鍵或惟一索引。我遇到過一例,以 url 來做爲惟一索引,可是它記錄的有多是亂碼,致使後來想把它們修復就特別麻煩。性能

參考:url

一、https://my.oschina.net/xsh1208/blog/1052781.net

二、http://seanlook.com/2016/10/23/mysql-utf8mb4/設計

相關文章
相關標籤/搜索