## 10.5 配置应用程序字符集和排序规则

[](<>)

对于使用默认 MySQL 字符集和排序规则存储数据的应用程序 (`utf8mb4`,`utf8mb4_0900_ai_ci`)，不需要特殊配置。如果应用程序需要使用不同的字符集或排序规则进行数据存储，您可以通过多种方式配置字符集信息：

-   指定每个数据库的字符设置。例如，使用一个数据库的应用程序可能会使用默认的`utf8mb4`，而使用另一个数据库的应用程序可能使用`sjis`.

-   在服务器启动时指定字符设置。这会导致服务器将给定的设置用于不进行其他安排的所有应用程序。

-   如果您从源代码构建 MySQL，请在配置时指定字符设置。这会导致服务器使用给定设置作为所有应用程序的默认设置，而无需在服务器启动时指定它们。

    当不同的应用程序需要不同的字符设置时，每个数据库的技术提供了很大的灵活性。如果大多数或所有应用程序使用相同的字符集，那么在服务器启动或配置时指定字符设置可能是最方便的。

    对于每个数据库或服务器启动技术，这些设置控制数据存储的字符集。应用程序还必须告诉服务器使用哪个字符集进行客户端/服务器通信，如以下说明中所述。

    此处显示的示例假定使用`拉丁语1`字符集和`latin1_swedish_ci`特定上下文中的排序规则作为默认值的替代`utf8mb4`和`utf8mb4_0900_ai_ci`.

-   **指定每个数据库的字符设置。**要创建一个数据库，使其表使用给定的默认字符集和排序规则来存储数据，请使用[`创建数据库`](create-database.html)像这样的声明：

    ```
    CREATE DATABASE mydb
      CHARACTER SET latin1
      COLLATE latin1_swedish_ci;
    ```

    在数据库中创建的表使用`拉丁语1`和`latin1_swedish_ci`默认情况下适用于任何字符列。

    使用数据库的应用程序还应在每次连接时配置与服务器的连接。这可以通过执行`设置名称'latin1'`连接后的声明。无论连接方法如何，都可以使用该语句（[**mysql**](mysql.html)客户端、PHP 脚本等）。

    在某些情况下，可以将连接配置为以其他方式使用所需的字符集。例如，使用连接[**mysql**](mysql.html), 你可以指定[`--默认字符集=latin1`](mysql-command-options.html#option_mysql_default-character-set)命令行选项达到同样的效果`设置名称'latin1'`.

    有关配置客户端连接的更多信息，请参阅[第 10.4 节，“连接字符集和排序规则”](charset-connection.html).

    笔记

    如果你使用[`改变数据库`](alter-database.html)要更改数据库默认字符集或排序规则，必须删除并重新创建数据库中使用这些默认值的现有存储例程，以便它们使用新的默认值。（在存储例程中，如果未明确指定字符集或排序规则，则具有字符数据类型的变量将使用数据库默认值。请参阅。）[第13.1.17节，“创建程序和创建函数语句”](create-procedure.html).)

-   **在服务器启动时指定字符设置。**要在服务器启动时选择字符集和排序规则，请使用[`--字符集服务器`](server-system-variables.html#sysvar_character_set_server)和[`--排序服务器`](server-system-variables.html#sysvar_collation_server)选项。例如，要指定选项文件中的选项，请包括以下行：

    ```
    [mysqld]
    character-set-server=latin1
    collation-server=latin1_swedish_ci
    ```

    这些设置应用于服务器范围，并作为默认值应用于任何应用程序创建的数据库以及在这些数据库中创建的表。

    应用程序仍然需要使用[`定名`](set-names.html)如前所述，在它们连接后使用或等效。您可能想用[`--init_connect=“设置名称'latin1'”`](server-system-variables.html#sysvar_init_connect)选择导致[`定名`](set-names.html)为每个连接的客户端自动执行。然而，这可能会产生不一致的结果，因为[`init_connect`](server-system-variables.html#sysvar_init_connect)对于具有[`连接管理`](privileges-provided.html#priv_connection-admin)特权（或不推荐的[`超级的`](privileges-provided.html#priv_super)特权）。

-   **在MySQL配置时指定字符设置。**如果从源代码配置和构建MySQL，要选择字符集和排序规则，请使用[`默认字符集`](source-configuration-options.html#option_cmake_default_charset)和[`默认排序规则`](source-configuration-options.html#option_cmake_default_collation) **CMake**选项：

    ```
    cmake . -DDEFAULT_CHARSET=latin1 \
      -DDEFAULT_COLLATION=latin1_swedish_ci
    ```

    结果服务器使用`拉丁语1`和`拉丁语瑞典语`作为数据库和表以及客户端连接的默认设置。没有必要使用[`--字符集服务器`](server-system-variables.html#sysvar_character_set_server)和[`--排序服务器`](server-system-variables.html#sysvar_collation_server)在服务器启动时指定这些默认值。应用程序也不需要使用[`定名`](set-names.html)或在连接到服务器后使用同等产品。

    不管如何配置MySQL字符集以供应用程序使用，您还必须考虑这些应用程序在其中执行的环境。例如，如果要使用从编辑器中创建的文件中提取的UTF-8文本发送语句，则应使用设置为UTF-8的环境语言环境编辑该文件，以确保文件编码正确，并确保操作系统正确处理该文件。如果你使用[**mysql**](mysql.html)客户端在终端窗口中，必须将窗口配置为使用UTF-8，否则可能无法正确显示字符。对于在Web环境中执行的脚本，该脚本必须正确处理字符编码，以便与MySQL服务器交互，并且必须生成正确指示编码的页面，以便浏览器知道如何显示页面内容。例如，您可以包括以下内容：`<meta>`在你的身体里贴标签`<head>`要素：


```
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
```
