每个 “字符” 列(即,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 会尝试映射数据值,但如果字符集不兼容,则可能会丢失数据。