每個「字元」資料欄(即,類型為 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_nameCOLLATE,則使用字元集collation_namecharset_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_nameCOLLATE,則使用字元集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_SCHEMACHARACTER_SETS資料表。如果指定了
COLLATE而沒有collation_nameCHARACTER 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 會嘗試對資料值進行對應,但如果字元集不相容,則可能會發生資料遺失。