1. 程式人生 > 其它 >Mysql建庫字符集和排序規則選擇

Mysql建庫字符集和排序規則選擇

Mysql建庫字符集和排序規則選擇

先出結論,字符集選擇utf8mb4,排序規則選擇utf8mb4_unicode_ci

字符集

常見字符集

  • GBK編碼專門用來解決中文編碼的,是雙位元組的。不論中英文都是雙位元組的。GBK包含全部中文字元;
  • UTF-8編碼中,一個英文字元佔用一個位元組的儲存空間,一箇中文(含繁體)佔用三個位元組的儲存空間。UTF-8則包含全世界所有國家需要用到的字元。
  • UTF-8mb4支援4個位元組的儲存,如emoji表情。
  • ASCII編碼中,一個英文字母(不分大小寫)佔用一個位元組的空間,一箇中文漢字佔用兩個位元組的空間。一個二進位制的數字序列,在計算機中作為一個數字單元儲存時,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。
  • Unicode編碼中,一個英文佔用兩個位元組的儲存空間,一箇中文(含繁體)佔用兩個位元組的儲存空間。
  • UTF-16編碼中,一個英文字母字元或一個漢字字元儲存都需要佔用2個位元組的儲存空間(Unicode擴充套件區的一些漢字儲存需要4個位元組)。
  • UTF-32編碼中,世界上任何字元的儲存都需要佔用4個位元組的儲存空間。

UTF-8mb4

​ utf8mb4的出生其實很簡單,utf8(most bytes 3)以三個位元組儲存字元,並不能支援生僻漢字和表情的輸入,MySQL在5.5.3版本以後增加了utf8mb4(most bytes 4)編碼提供瞭解決方案。現在預設字符集即為utf8mb4。

排序規則

準確性

  • utf8mb4_unicode_ci 是基於標準的Unicode來排序和比較,能夠在各種語言之間精確排序。
  • utf8mb4_general_ci 沒有實現Unicode排序規則,在遇到某些特殊語言或字元是,排序結果可能不是所期望的。

utf8mb4_unicode_ci使用unicode規則進行排序和比較,它使用相當複雜的演算法在各種語言中以及在使用各種特殊字元時進行正確排序。這些規則需要考慮到特定語言的約定,並不是每個人都按照我們所說的“字母順序”對字元進行排序。就拉丁語(即“歐洲”)而言,MySQL中的Unicode排序和簡化的utf8mb4_general_ci排序沒有太大區別,但仍有一些區別;utf8mb4_-general_ci的適用性將在很大程度上取決於所使用的語言。對某些語言來說,這是相當不夠的。

效能

  • utf8mb4_general_ci 在比較和排序的時候更快
  • utf8mb4_unicode_ci 在特殊情況下,Unicode排序規則為了能夠處理特殊字元的情況,實現了略微複雜的排序演算法。

以前我們使用general方式的排序,是受限於cpu的速度,所以使用更快的排序規則,但是就目前的伺服器而言,cpu的速度已經可以忽略這兩種排序規則的速度差異了,所以個人也認為unicode規則會更好一點

參考連結