每個「字元」資料行(也就是類型為 CHAR
、VARCHAR
、TEXT
類型或任何同義字)都有一個資料行字元集和一個資料行校對。用於 CREATE TABLE
和 ALTER TABLE
的資料行定義語法具有選用子句,可用於指定資料行字元集和校對
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
col_name {ENUM | SET} (val_list)
[CHARACTER SET charset_name]
[COLLATE collation_name]
範例
CREATE TABLE t1
(
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_german1_ci
);
ALTER TABLE t1 MODIFY
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
MySQL 會以下列方式選擇資料行字元集和校對
如果同時指定
CHARACTER SET
和charset_name
COLLATE
,則會使用字元集collation_name
charset_name
和校對collation_name
。CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) CHARACTER SET latin1 COLLATE latin1_bin;
已為資料行指定字元集和校對,因此會使用它們。資料行具有字元集
utf8mb4
和校對utf8mb4_unicode_ci
。如果指定了
CHARACTER SET
但未指定charset_name
COLLATE
,則會使用字元集charset_name
及其預設校對。CREATE TABLE t1 ( col1 CHAR(10) CHARACTER SET utf8mb4 ) CHARACTER SET latin1 COLLATE latin1_bin;
已為資料行指定字元集,但未指定校對。資料行具有字元集
utf8mb4
和utf8mb4
的預設校對,即utf8mb4_0900_ai_ci
。若要查看每個字元集的預設校對,請使用SHOW CHARACTER SET
陳述式或查詢INFORMATION_SCHEMA
CHARACTER_SETS
資料表。如果指定了
COLLATE
但未指定collation_name
CHARACTER SET
,則會使用與collation_name
相關聯的字元集和校對collation_name
。CREATE TABLE t1 ( col1 CHAR(10) COLLATE utf8mb4_polish_ci ) CHARACTER SET latin1 COLLATE latin1_bin;
已為資料行指定校對,但未指定字元集。資料行具有校對
utf8mb4_polish_ci
,且字元集是與校對相關聯的字元集,即utf8mb4
。否則(未指定
CHARACTER SET
和COLLATE
),則會使用資料表的字元集和校對。CREATE TABLE t1 ( col1 CHAR(10) ) CHARACTER SET latin1 COLLATE latin1_bin;
未為資料行指定字元集或校對,因此會使用資料表的預設值。資料行具有字元集
latin1
和校對latin1_bin
。
CHARACTER SET
和 COLLATE
子句是標準 SQL。
如果您使用 ALTER TABLE
將資料行從一個字元集轉換為另一個字元集,MySQL 會嘗試對應資料值,但如果字元集不相容,可能會遺失資料。