每个“字符”列(即类型为
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 utf8 COLLATE utf8_unicode_ci ) CHARACTER SET latin1 COLLATE latin1_bin;
为列指定了字符集和排序规则,因此使用它们。该列有 character set
utf8
和 collationutf8_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
.否则(既未指定
CHARACTER SET
也未COLLATE
指定),使用表字符集和排序规则。CREATE TABLE t1 ( col1 CHAR(10) ) CHARACTER SET latin1 COLLATE latin1_bin;
没有为列指定字符集和排序规则,因此使用表默认值。该列有 character set
latin1
和 collationlatin1_bin
。
CHARACTER SET
and
COLLATE
子句是标准 SQL
。
如果您使用ALTER TABLE
将列从一种字符集转换为另一种字符集,MySQL 会尝试映射数据值,但如果字符集不兼容,则可能会丢失数据。