一个“ connection ”是当它连接到服务器,开始在其内与服务器交互会话的客户端程序发出什么。客户端通过会话连接发送SQL语句,例如查询。服务器通过连接将响应(例如结果集或错误消息)发送回客户端。
连接字符集和整理系统变量
几个字符集和排序规则系统变量与客户端与服务器的交互有关。其中一些已在前面的部分中提到:
1、character_set_server 和collation_server系统变量指示服务器字符集和整理。
2、character_set_database 和collation_database 系统变量表示默认数据库的字符集和校对。
在处理客户端和服务器之间连接的流量时,还涉及其他字符集和排序规则系统变量。每个客户端都有特定于会话的与连接有关的字符集和整理系统变量。这些会话系统变量值在连接时初始化,但可以在会话中更改。
关于客户端连接的字符集和排序规则处理的几个问题可以通过系统变量来回答:
1、语句离开客户时所使用的字符集是什么?
服务器将 character_set_client系统变量作为字符集,客户端在其中发送语句。
注意
某些字符集不能用作客户端字符集。请参阅 不允许的客户字符集。
2、服务器在收到语句后应将其转换为什么字符集?
为了确定这一点,服务器使用 character_set_connection 和collation_connection 系统变量:
(1)、服务器将客户端发送的语句从转换 character_set_client为 character_set_connection。例外:对于具有介绍人的字符串文字,例如_utf8mb4或 _latin2,介绍人确定字符集。
(2)、collation_connection对于文字字符串的比较很重要。对于将字符串与列值进行比较, collation_connection 没关系,因为列具有自己的排序规则,排序规则具有更高的排序规则优先级(请参见 第10.8.4节“表达式中的排序规则可强制性”)。
3、在将查询结果发送回客户端之前,服务器应将其转换为什么字符集?
所述character_set_results 系统变量指示的字符集,其中所述服务器查询结果返回到客户端。这包括结果数据(例如列值),结果元数据(例如列名)和错误消息。
要告诉服务器不对结果集或错误消息进行任何转换,请将设置 character_set_results为 NULL或binary:
SET character_set_results = NULL;
SET character_set_results = binary;
要查看适用于当前会话的字符集和排序规则系统变量的值,请使用以下语句:
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
'character_set_client', 'character_set_connection',
'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
以下更简单的语句还显示连接变量,但也包括其他相关变量。它们对于查看所有字符集和归类系统变量很有用:
SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';
客户端可以微调这些变量的设置,或者取决于默认值(在这种情况下,您可以跳过本节的其余部分)。如果不使用默认值,则必须更改与服务器的每个连接的字符设置。
不允许的客户字符集
character_set_client系统变量不能设置为特定字符集为:
ucs2
utf16
utf16le
utf32
尝试将任何这些字符集用作客