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 轉換格式,使用 8 位元單位)方法對 Unicode 資料進行編碼是根據 RFC 3629 實作的,該 RFC 描述了採用一到四個位元組的編碼序列。UTF-8 的概念是使用不同長度的位元組序列對各種 Unicode 字元進行編碼
基本拉丁字母、數字和標點符號使用一個位元組。
大多數歐洲和中東文字母都適合 2 位元組序列:擴充拉丁字母(帶有波浪號、長音符號、銳音符號、重音符號和其他重音符號)、斯拉夫字母、希臘字母、亞美尼亞字母、希伯來字母、阿拉伯字母、敘利亞字母等。
韓文、中文和日文的表意文字使用 3 位元組或 4 位元組序列。
MySQL 支援這些 Unicode 字元集
utf8mb4
:Unicode 字元集的 UTF-8 編碼,每個字元使用一到四個位元組。utf8mb3
:Unicode 字元集的 UTF-8 編碼,每個字元使用一到三個位元組。此字元集已棄用,並會在未來版本中移除;請改用utf8mb4
。utf8
:utf8mb3
的已棄用別名;請改用utf8mb4
。注意utf8
預計在未來版本的 MySQL 中成為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 8.4 也會在 Information Schema 表格的資料行中以及 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 之外的字元在轉換為僅支援 BMP 字元的 Unicode 字元集(utf8mb3
或 ucs2
)時會比較為 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 字元集的更多詳細資訊。