每個「字元」資料欄(即,類型為 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 會嘗試對資料值進行對應,但如果字元集不相容,則可能會發生資料遺失。