Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.3.5 列字符集和排序规则

每个字符列(即类型为CHARVARCHAR、类型为TEXT或任何同义词)都有一个列字符集和列排序规则。列定义语法对于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]

示例:

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 utf8mb4 COLLATE utf8mb4_unicode_ci
    ) CHARACTER SET latin1 COLLATE latin1_bin;

    指定了列字符集和排序规则,所以它们被使用。该列的字符集为utf8mb4,排序规则为utf8mb4_unicode_ci

  • 如果未指定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_SCHEMACHARACTER_SETS表。

  • 如果未指定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 SETCOLLATE 子句是标准SQL。

如果使用ALTER TABLE 将列从一个字符集转换到另一个字符集,MySQL 尝试映射数据值,但如果字符集不兼容可能会出现数据丢失。