跳到主要内容

客户端连接的字符集和字符序

"连接"是指客户端程序连接到服务器时建立的会话,以开始与服务器的交互。客户端通过会话连接发送 SQL 语句(例如查询)。服务器通过连接将响应(例如结果集或错误消息)发送回客户端。

字符集和字符序的系统变量

以下字符集和字符序的系统变量和客户端与服务器的交互有关:

  • character_set_servercollation_server 系统变量指定服务器的字符集和字符序。

  • character_set_databasecollation_database 系统变量指定数据库的默认字符集和字符序。

此外,服务器还会使用以下系统变量:

  • character_set_client 系统变量用于设置客户端发送语句的字符集。

  • character_set_connection 系统变量用于设置收到语句后应转换的字符集。服务器将客户端发送的语句从 character_set_client 转换为 character_set_connection

  • collat​​ion_connection 系统变量用于设置连接使用的字符集和字符序。collat​​ion_connection 对于字符串的比较很重要。

  • character_set_results 系统变量用于设置服务器向客户端返回查询结果的字符集,包括数据结果(例如列值)、元数据(例如列名称)和错误消息。如果不需要不执行结果集或错误消息的转换,请将 character_set_results 设置为 NULL 或二进制,语法如下:

    SET character_set_results = NULL;
    SET character_set_results = binary;

以下语句可以查看所有字符集和字符序的系统变量:

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb4 |
+--------------------------+---------+
7 rows in set (0.009 sec)

SHOW SESSION VARIABLES LIKE 'collation\_%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.002 sec)

配置客户端字符集的 SQL 语句

建立连接后,客户端可以更改当前会话的字符集和字符序的系统变量。可以使用如下 SET 语句更改这些变量:

  • SET NAMES 'charset_name' 语句。

    用来设定客户端会在之后的请求中使用的字符集。等效于以下三个语句:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;

    要指定用于 collation_connection 的字符序,请添加 COLLATE子句:

    SET NAMES 'charset_name' COLLATE 'collation_name'
  • SET CHARACTER SET 'charset_name' 语句。

    类似于 SET NAMES,但其将 character_set_connectioncollation_connection 设置为 character_set_databasecollation_database,即默认数据库的字符集和字符序。等效于以下三个语句:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET collation_connection = @@collation_database;