官方文档地址:10.3.5 Column Character Set and Collation
每个“字符”列(也就是说,类型为CHAR
、VARCHAR
、TEXT
类型或任何同义词的列)都有一个列字符集和一个列排序规则。CREATE TABLE
和ALTER TABLE
的列定义语法有指定列字符集和排序规则的可选子句:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
这些子句也可以用于ENUM
和SET
列:
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 utf8 COLLATE utf8_unicode_ci
) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集和排序规则,因此它们被使用。该列具有字符集utf8
和排序规则utf8_unicode_ci
。
- 如果指定的
CHARACTER SET charset_name
没有指定COLLATE
,则使用字符集charset_name
及其默认排序规则。
CREATE TABLE t1
(
col1 CHAR(10) CHARACTER SET utf8
) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集,但没有指定排序规则。该列具有utf8
字符集和utf8
的默认排序规则,即utf8_general_ci
。要查看每个字符集的默认排序规则,可以使用SHOW CHARACTER SET
语句或查询INFORMATION_SCHEMA
CHARACTER_SETS
表。
- 如果只有
COLLATE collation_name
没有CHARACTER SET
,则使用与collation_name
相关联的字符集和collation_name
排序规则。
CREATE TABLE t1
(
col1 CHAR(10) COLLATE utf8_polish_ci
) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了排序规则,但没有指定字符集。该列具有utf8_polish_ci
排序规则,字符集是与该排序规则相关联的字符集,即utf8
。
- 没有指定字符集和排序规则,将使用表字符集和排序规则。
CREATE TABLE t1
(
col1 CHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin;
没有为列指定字符集和排序规则,因此使用表默认的字符集或排序规则。该列具有字符集latin1
和排序规则latin1_bin
。
CHARACTER SET
和COLLATE
子句是标准 SQL。
如果你使用ALTER TABLE
将一个列从一个字符集转换到另一个字符集,MySQL 会尝试映射数据值,但是如果字符集不兼容,可能会导致数据丢失。