### 10.3.5 列字符集和排序规则

每个“字符”列（即类型的列[`字符`](char.html),[`VARCHAR`](char.html)， 一种[`文本`](blob.html)type 或任何同义词）具有列字符集和列排序规则。列定义语法[`创建表`](create-table.html)和[`更改表`](alter-table.html)具有用于指定列字符集和排序规则的可选子句：

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

这些子句也可用于[`枚举`](enum.html)和[`放`](set.html)列：

```
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`.要查看每个字符集的默认排序规则，请使用[`显示字符集`](show-character-set.html)声明或查询`INFORMATION_SCHEMA` [`CHARACTER_SETS`](information-schema-character-sets-table.html)桌子。

-   如果`整理 *`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。

    如果你使用[`更改表`](alter-table.html)要将列从一个字符集转换为另一个，MySQL 会尝试映射数据值，但如果字符集不兼容，则可能会丢失数据。
