1. 程式人生 > >MySQL 字符集utf8和utf-8的關系

MySQL 字符集utf8和utf-8的關系

def init cti 英文 col 可選 目錄 進制數 sets

目錄

  • 什麽是字符集(character set)
  • 校對規則(collation)
  • ASCII碼
  • Unicode國際化支持
  • UTF-8
  • utf8
  • utf8與utf8mb4的關系
  • 超集
  • 字符集設置

什麽是字符集(character set)

  • 字符的二進制編碼方式
  • 二進制編碼到一套字符的映射
  • 二進制->編碼->字符

校對規則(collation)

  • 在字符集內用於比較字符的一套規則

ASCII碼

  • 1個字節由8個二進制位組成
  • 1個字節可表示256種不同的狀態(256個不同符號)
  • ASCII碼規定了128個字符(英文字符和一些標點符號)的編碼

Unicode國際化支持

  • 世界上存在多種編碼方式,同一個二進制數字被解釋成了不同的符號
  • 現存 編碼 不能在多語言環境中使用,誕生了Unicode(統一碼)
  • 一個字符的Unicode編碼是確定的
  • Unicode編碼實現方式各不相同
  • Unicode的實現方式稱為Unicode轉化格式(UTF)

UTF-8

  • UTF-8是Unicode的實現方式之一
  • 其它實現方式還有UTF-16, UTF-32
  • 變長編碼,一個符號使用1~4個字節表示
  • utf8是MySQL存儲Unicode數據的一種可選方法

utf8

  • MySQL中實現了UTF-8編碼的unicode 字符集
  • MySQL中utf8是utf8mb3的別名
  • utf8中,一個符號使用1~3個節點表示
  • 對UTF-8支持不徹底,可采用utf8mb4字符集

utf8與utf8mb4的關系

  • 都是實現了UTF-8編碼的unicode 字符集
  • utf8僅支持基本多語言平面Basic Multilingual Plane (BMP)
  • utf8mb4支持BMP之外的補充字符(如emoji,emoji 是一種特殊的 Unicode 編碼)
  • utf8 一個字符最多使用3個字節存儲,utf8mb4 一個字符最多使用4個字節存儲
  • 對於BMP字符,utf8和utf8mb4具有相同的編碼,相同的長度
  • 對於非BMP字符,utf8mb4使用4個字節來存儲,utf8不能存儲非BMP字符
  • innodb中默認最大可對767個字節建立索引
  • 使用utf8 的列最多可對255個字符建立索引
  • 使用utf8mb4 的列最多可對191個字符建立索引

超集

  • 字符集A,B ,B支持的所有字符A都支持,A 是B超集
  • 比如 GBK字符集是GB2312字符集的超集,它們又都是ASCII字符集的超集
  • utf8mb4是utf8的超集

字符集設置

set names x 等價於

  • set character_set_client=x;
  • set character_set_connection=x;
  • set character_set_results=x;

--default-character-set 用戶連接時設置字符集 等價於

  • set character_set_client=x;
  • set character_set_connection=x;
  • set character_set_result=x;
    init-connect=set names binary
  • 讓client和server交互的時候以 什麽模式(不做任何轉化)來傳送

default-character-set

  • 設置[mysql]和[client] 中的字符集

character-set-server

  • 設置[mysqld] 進程的默認字符集

collation-server

  • 設置[mysqld] 進程的默認校對規則
  • utf8_general_ci 查找、排序不區分大小寫
  • utf8_bin 查找、排序區分大小寫

參考
Unicode Support
字符集與編碼雜談
ASCII,Unicode 和 UTF-8
清官談mysql中utf8和utf8mb4區別

MySQL 字符集utf8和utf-8的關系