10.3.5 列字符集和排序规则

每个“字符”列(即CHARVARCHARTEXT类型或任何同义词的列)都有一个列字符集和一个列排序规则。 CREATE TABLEALTER TABLE的列定义语法具有用于指定列字符集和排序规则的可选子句:

col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name]
    [COLLATE collation_name]

这些子句也可用于ENUMSET列:

col_name {ENUM | SET} (val_list)
    [CHARACTER SET charset_name]
    [COLLATE collation_name]

Examples:

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_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;

为该列指定了字符集,但未指定排序规则。该列具有字符集utf8utf8的默认排序规则,即utf8_general_ci。要查看每个字符集的默认排序规则,请使用显示字符集语句或查询INFORMATION_SCHEMA CHARACTER_SETStable。

  • 如果指定的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 SETCOLLATE),将使用 table 字符集和排序规则。
CREATE TABLE t1
(
    col1 CHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin;

没有为该列指定字符集或排序规则,因此使用 table 默认值。该列具有字符集latin1和排序规则latin1_bin

CHARACTER SETCOLLATE子句是标准 SQL。

如果使用ALTER TABLE将列从一个字符集转换为另一个字符集,则 MySQL 会尝试 Map 数据值,但是如果字符集不兼容,则可能会丢失数据。