Documentation Home

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]

例子:

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_namecharset_namecollation_name

    CREATE TABLE t1
    (
        col1 CHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
    ) CHARACTER SET latin1 COLLATE latin1_bin;

    为列指定了字符集和排序规则,因此使用它们。该列有 character set utf8mb4和 collat​​ion utf8mb4_unicode_ci

  • 如果没有指定,则使用字符集 及其默认排序规则。 CHARACTER SET charset_nameCOLLATEcharset_name

    CREATE TABLE t1
    (
        col1 CHAR(10) CHARACTER SET utf8mb4
    ) CHARACTER SET latin1 COLLATE latin1_bin;

    为列指定了字符集,但没有指定排序规则。该列具有字符集 utf8mb4和 的默认排序规则 utf8mb4,即 utf8mb4_0900_ai_ci. 要查看每个字符集的默认排序规则,请使用 SHOW CHARACTER SET语句或查询INFORMATION_SCHEMA CHARACTER_SETS表。

  • 如果没有指定,则使用关联的字符集 和排序规则 。 COLLATE collation_nameCHARACTER SETcollation_namecollation_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;

    没有为列指定字符集和排序规则,因此使用表默认值。该列有 character setlatin1和 collat​​ion latin1_bin

CHARACTER SETand COLLATE子句是标准 SQL 。

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