文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  utf16 字元集 (UTF-16 Unicode 編碼)

12.9.5 utf16 字元集 (UTF-16 Unicode 編碼)

utf16 字元集是 ucs2 字元集的延伸,可啟用補充字元的編碼

  • 對於 BMP 字元,utf16ucs2 具有相同的儲存特性:相同的程式碼值、相同的編碼、相同的長度。

  • 對於補充字元,utf16 具有特殊的序列,可使用 32 位元來表示字元。這稱為代理對機制:對於大於 0xffff 的數字,取 10 位元並將其加到 0xd800 並放入第一個 16 位元字中,再取 10 位元並將其加到 0xdc00 並放入下一個 16 位元字中。因此,所有補充字元都需要 32 位元,其中前 16 位元是介於 0xd8000xdbff 之間的數字,而後 16 位元是介於 0xdc000xdfff 之間的數字。範例位於 Unicode 4.0 文件中的 15.5 代理對區域 一節。

因為 utf16 支援代理對而 ucs2 不支援,因此有一個僅適用於 utf16 的有效性檢查:您不能在沒有下代理對的情況下插入上代理對,反之亦然。例如

INSERT INTO t (ucs2_column) VALUES (0xd800); /* legal */
INSERT INTO t (utf16_column)VALUES (0xd800); /* illegal */

對於技術上有效但並非真正 Unicode 的字元(也就是說,Unicode 認為是未指派的程式碼點私人使用字元,甚至是像 0xffff 這樣的非法字元),沒有有效性檢查。例如,由於 U+F8FF 是 Apple 標誌,因此這是合法的

INSERT INTO t (utf16_column)VALUES (0xf8ff); /* legal */

不能期望這些字元對所有人都有相同的意義。

由於 MySQL 必須允許最壞的情況(一個字元需要四個位元組),因此 utf16 欄位或索引的最大長度只有 ucs2 欄位或索引最大長度的一半。例如,MEMORY 資料表索引鍵的最大長度為 3072 個位元組,因此以下陳述式會建立具有 ucs2utf16 欄位最長允許索引的資料表

CREATE TABLE tf (s1 VARCHAR(1536) CHARACTER SET ucs2) ENGINE=MEMORY;
CREATE INDEX i ON tf (s1);
CREATE TABLE tg (s1 VARCHAR(768) CHARACTER SET utf16) ENGINE=MEMORY;
CREATE INDEX i ON tg (s1);