MySQL 8.4 版本注意事項
utf16
字元集是 ucs2
字元集的延伸,可啟用補充字元的編碼
對於 BMP 字元,
utf16
和ucs2
具有相同的儲存特性:相同的程式碼值、相同的編碼、相同的長度。對於補充字元,
utf16
具有特殊的序列,可使用 32 位元來表示字元。這稱為「代理對」機制:對於大於0xffff
的數字,取 10 位元並將其加到0xd800
並放入第一個 16 位元字中,再取 10 位元並將其加到0xdc00
並放入下一個 16 位元字中。因此,所有補充字元都需要 32 位元,其中前 16 位元是介於0xd800
和0xdbff
之間的數字,而後 16 位元是介於0xdc00
和0xdfff
之間的數字。範例位於 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 個位元組,因此以下陳述式會建立具有 ucs2
和 utf16
欄位最長允許索引的資料表
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);