# 10.3.5 列字符集和排序规则

每个“字符”列(即类型的列字符,VARCHAR, 一种文本type 或任何同义词)具有列字符集和列排序规则。列定义语法创建表更改表具有用于指定列字符集和排序规则的可选子句:

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 以下列方式选择列字符集和排序规则:

  • 如果两者字符集 *字符集名称*整理 *collat​​ion_name*已指定,字符集*字符集名称和整理collat​​ion_name*被使用。

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

    为列指定了字符集和排序规则,因此使用它们。该列具有字符集utf8和整理utf8_unicode_ci.

  • 如果字符集 *字符集名称*没有指定整理, 字符集*字符集名称*并使用其默认排序规则。

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

    为列指定了字符集,但没有指定排序规则。该列具有字符集utf8和默认排序规则utf8,即utf8_general_ci.要查看每个字符集的默认排序规则,请使用显示字符集声明或查询INFORMATION_SCHEMA CHARACTER_SETS桌子。

  • 如果整理 *collat​​ion_name*没有指定字符集, 与相关的字符集*collat​​ion_name和整理collat​​ion_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;
    

    没有为该列指定字符集或排序规则,因此使用表默认值。该列具有字符集拉丁语1和整理latin1_bin.

    字符集整理子句是标准 SQL。

    如果你使用更改表要将列从一个字符集转换为另一个,MySQL 会尝试映射数据值,但如果字符集不兼容,则可能会丢失数据。