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