Unicode 標準包含基本多文種平面 (BMP) 中的字元,以及位於 BMP 之外的補充字元。本節描述 MySQL 中對 Unicode 的支援。如需 Unicode 標準本身的相關資訊,請造訪 Unicode 協會網站。
BMP 字元具有以下特性
它們的碼位值介於 0 和 65535 之間(或
U+0000
和U+FFFF
)。它們可以使用 8、16 或 24 位元(1 到 3 個位元組)的可變長度編碼進行編碼。
它們可以使用 16 位元(2 個位元組)的固定長度編碼進行編碼。
它們足以應付主要語言中幾乎所有字元。
補充字元位於 BMP 之外
它們的碼位值介於
U+10000
和U+10FFFF
之間。對補充字元的 Unicode 支援需要具有 BMP 字元之外範圍的字元集,因此比 BMP 字元佔用更多空間(每個字元最多 4 個位元組)。
UTF-8 (Unicode Transformation Format with 8-bit units) 方法,用於根據 RFC 3629 編碼 Unicode 資料,該 RFC 描述了從 1 到 4 個位元組的編碼序列。UTF-8 的概念是使用不同長度的位元組序列對各種 Unicode 字元進行編碼
基本拉丁字母、數字和標點符號使用一個位元組。
大多數歐洲和中東腳本字母適合 2 位元組序列:擴充拉丁字母(帶有波浪號、長音符號、銳音符號、重音符號和其他變音符號)、斯拉夫語、希臘語、亞美尼亞語、希伯來語、阿拉伯語、敘利亞語等。
韓文、中文和日文表意文字使用 3 位元組或 4 位元組序列。
MySQL 支援這些 Unicode 字元集
utf8mb4
:Unicode 字元集的 UTF-8 編碼,每個字元使用一到四個位元組。utf8mb3
:Unicode 字元集的 UTF-8 編碼,每個字元使用一到三個位元組。此字元集已被棄用,可能會在未來版本中移除;請改用utf8mb4
。utf8
:utf8mb3
的已棄用別名;請改用utf8mb4
。注意預計在未來版本的 MySQL 中,
utf8
將成為utf8mb4
的別名。ucs2
:Unicode 字元集的 UCS-2 編碼,每個字元使用兩個位元組。已棄用;預期將在未來版本中移除對此字元集的支援。utf16
:Unicode 字元集的 UTF-16 編碼,每個字元使用兩個或四個位元組。與ucs2
類似,但擴充了對補充字元的支援。utf16le
:Unicode 字元集的 UTF-16LE 編碼。與utf16
類似,但為小端而非大端。utf32
:Unicode 字元集的 UTF-32 編碼,每個字元使用四個位元組。
utf8mb3
字元集已被棄用,您應該預期它會在未來的 MySQL 版本中被移除。請改用 utf8mb4
。utf8
目前是 utf8mb3
的別名,但現在已被棄用,而 utf8
預計隨後會成為對 utf8mb4
的引用。MySQL 9.0 還會在資訊綱要表格的欄位中,以及 SQL SHOW
語句的輸出中顯示 utf8mb3
而不是 utf8
。
此外,您應該知道,在舊版 MySQL 中使用 utf8_
前綴的校對,之後已使用 utf8mb3_
前綴重新命名。
為了避免 utf8
含義的歧義,請考慮針對字元集引用明確指定 utf8mb4
。
如表 12.2,「Unicode 字元集一般特性」所述,其中摘要了 MySQL 支援的 Unicode 字元集的一般特性。
表 12.2 Unicode 字元集一般特性
字元集 | 支援的字元 | 每個字元所需的儲存空間 |
---|---|---|
utf8mb3 、utf8 (已棄用) |
僅限 BMP | 1、2 或 3 個位元組 |
ucs2 |
僅限 BMP | 2 個位元組 |
utf8mb4 |
BMP 和補充字元 | 1、2、3 或 4 個位元組 |
utf16 |
BMP 和補充字元 | 2 或 4 個位元組 |
utf16le |
BMP 和補充字元 | 2 或 4 個位元組 |
utf32 |
BMP 和補充字元 | 4 個位元組 |
當轉換為僅支援 BMP 字元的 Unicode 字元集 (utf8mb3
或 ucs2
) 時,BMP 以外的字元會被視為 REPLACEMENT CHARACTER
並轉換為 '?'
。
如果您使用支援補充字元,且因此比僅限 BMP 的 utf8mb3
和 ucs2
字元集更「寬」的字元集,則您的應用程式可能會出現不相容的問題;請參閱第 12.9.8 節,「轉換 3 位元組和 4 位元組 Unicode 字元集」。該章節還說明如何將表格從 (3 位元組) utf8mb3
轉換為 (4 位元組) utf8mb4
,以及這樣做時可能適用的限制。
大多數 Unicode 字元集都有類似的一組校對規則。例如,每個字元集都有丹麥校對規則,其名稱為 utf8mb4_danish_ci
、utf8mb3_danish_ci
(已棄用)、utf8_danish_ci
(已棄用)、ucs2_danish_ci
、utf16_danish_ci
和 utf32_danish_ci
。例外的是 utf16le
,它只有兩個校對規則。關於 Unicode 校對及其區分特性,包括補充字元的校對特性,請參閱第 12.10.1 節,「Unicode 字元集」。
MySQL 對 UCS-2、UTF-16 和 UTF-32 的實作以大端位元組順序儲存字元,並且不在值的開頭使用位元組順序標記 (BOM)。其他資料庫系統可能會使用小端位元組順序或 BOM。在這種情況下,在這些系統和 MySQL 之間傳輸資料時,需要執行值的轉換。UTF-16LE 的實作是小端位元組序。
MySQL 對於 UTF-8 值不使用 BOM。
使用 Unicode 與伺服器通訊的客戶端應用程式應相應地設定客戶端字元集(例如,發出 SET NAMES 'utf8mb4'
陳述式)。某些字元集不能用作客戶端字元集。嘗試將它們與SET NAMES
或 SET CHARACTER SET
一起使用會產生錯誤。請參閱不允許的客戶端字元集。
以下章節提供有關 MySQL 中 Unicode 字元集的更多詳細資訊。