本文更新於2019-06-16,使用MySQL 5.7,操作系統為Deepin 15.4。 常用字元集 字元集 定長 代碼寬度 說明 ASCII或ISO-646 是 1位元組7位 英文字母、數字、標點符號和33個控制符 ISO-8859系列 是 1位元組8位 各西歐字元集,相容ASCII GB2312 ...
本文更新於2019-06-16,使用MySQL 5.7,操作系統為Deepin 15.4。
目錄
常用字元集
字元集 | 定長 | 代碼寬度 | 說明 |
---|---|---|---|
ASCII或ISO-646 | 是 | 1位元組7位 | 英文字母、數字、標點符號和33個控制符 |
ISO-8859系列 | 是 | 1位元組8位 | 各西歐字元集,相容ASCII |
GB2312 | 否 | 1或2位元組 | 相容ASCII,不推薦使用 |
GBK | 否 | 1或2位元組 | 相容GB2312 |
GB18030 | 否 | 1、2或4位元組 | 相容GBK |
Unicode或UCS-4或ISO-10646 | 是 | 4位元組 | 從最高位元組起依次代表組(group)、面(plane)、行(row)、格(ceil),包括BMP、輔助字面和專用字面 |
UCS-2 | 是 | 2位元組 | UCS-4的0組0面,即基本多語言文字面(BMP) |
Unicode有如下編碼方式:
編碼方式 | 定長 | 代碼寬度 | 說明 |
---|---|---|---|
UTF-8 | 否 | 1至6位元組 | 相容ASCII |
UTF-16 | 否 | 2或4位元組 | BMP使用2位元組表示,以外使用4位元組表示,按位元組序不同分為UTF-16BE和UTF-16LE |
UTF-32 | 是 | 4位元組 | Unicode原始編碼,按位元組序不同分為UTF-32BE和UTF-32LE |
UTF-8編碼如下:
位元組 | 代碼位數 | 代碼空間 | 位元組組合 |
---|---|---|---|
1 | 0-7 | 0x0 - 0x7f | 0xxxxxxx |
2 | 8-11 | 0x80 - 0x7ff | 110xxxxx,10xxxxxx |
3 | 12-16 | 0x800 - 0xffff | 1110xxxx,10xxxxxx,10xxxxxx |
4 | 17-21 | 0x10000 - 0x1fffff | 11110xxx,10xxxxxx,10xxxxxx,10xxxxxx |
5 | 22-26 | 0x200000 - 0x3ffffff | 111110xx,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx |
6 | 27-31 | 0x4000000 - 0x7fffffff | 1111110x,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx |
每個漢字,GBK使用2位元組,UTF-8使用3位元組。
MySQL字元集
MySQL的UTF-8字元集最大長度為3位元組,只能表示BMP中的字元(0-0xffff)。若要使用大於3位元組的字元(如emoji),則需使用utf8mb4字元集。
MySQL包含字元集和校對規則兩個概念。校對規則用來定義比較字元串的方式,一種字元集至少有一種校對規則,但可以有多種校對規則。校對規則的命名以其相關的字元集名開始,中間通常包含一個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(比較是基於字元編碼的值而與語言無關)結束,如gbk_chinese_ci。
MySQL的字元集和校對規則有4個級別的設置:
- 伺服器級:可通過配置文件或啟動選項設置,預設為latin1。
- 資料庫級:可通過
CREATE DATABASE
或ALTER DATABASE
設置,如資料庫中已存在記錄,修改字元集不會將已有數據按照新的字元集進行存放。 - 表級:可通過
CREATE TABLE
或ALTER TABLE
設置,如表中已存在記錄,修改字元集不會將已有數據按照新的字元集進行存放。 - 欄位級:可通過
CREATE TABLE
或ALTER TABLE
設置,如表中已存在記錄,修改字元集不會將已有數據按照新的字元集進行存放。
客戶端和伺服器交互時,還存在客戶端、連接、返回結果的字元集和校對規則,通常這三者是相同的,才可以確保數據能被正確讀取。可以通過SET NAMES charset
同時修改這三個值。可以通過[_charset] 'str' [COLLATE collation]
強制字元串的字元集和校對規則。
已有記錄的字元集調整,需先將數據導出,經過適當調整後重新導入。