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