有几个编码集是与服务器有关的。一些在前面的部分已经提到了:
1.服务器的编码集和校对规则的值分别是character_set_server和collation_server这两个系统变量。
2.默认数据库的编码集和校对规则的值分别是character_set_database和collation_database这两个系统变量。
还有一些编码集和核对规则的系统变量是参与处理了客户端与服务器之间连接的通信。每个客户端都有其连接相关的编码集和核对规则的系统变量。
“连接”是在客户端连接到服务器的时候创建的。客户端发送SQL语句,例如查询,是通过“连接”传输到服务器的。服务器发送响应,例如结果集或者错误信息,通过“连接”传回到客户端。
这就引出了一些有关编码集和核对规则在处理客户端连接的问题,这些问题都能在系统变量的条款中得到了回答:
1.当SQL语句从客户端发送出来的时候,这条语句的编码集是什么?
服务器是以character_set_client这个系统变量的值作为语句的编码集。
2.当服务器收到语句后,按什么编码集来解释这条语句?
对于这个情况,服务器采用了character_set_connection和collation_connection这两个系统变量的值来解释语句。它将客户端发出的语句从character_set_client转换成
character_set_connection的编码集(除了像_latin1或者_utf8这类有“介绍人”的文字字符串)。collation_connection对于文字字符串的比较来说是非常重要的。对于列值
中的字符串的比较,collation_connection的值就无所谓了,因为每个列有其自己的核对规则(collation),并且具有更高的collation优先级。
3.服务器按什么编码集解释结果集或者错误信息,然后返回给客户端?
character_set_results这个系统变量标志了服务器返回给客户端查询结果的编码集。包括像列值这样的结果数据,也包括像列名和错误信息这样的结果元数据。
客户端可以调整这些系统变量的设置,或者由系统的默认值而定(在这种情况下,读者可以跳过本节后续内容)。如果不想使用默认值,就必须修改每一个连接的字符集设置。
有两条语句可以方便地修改与连接相关的变量:
1.SET NAMES '%charset_name%' [COLLATE '%collation_name%']
SET NAMES 标志着客户端给服务器发送SQL语句时候将会采用的编码集。因此,SET NAMES 'cp1251' 就是告诉服务器:“以后由此客户端传入的信息都是以cp1251编码集进行编码的”。
它也同样指定了服务器返回结果集给客户端时所采用的编码集。(例如:当你使用SELECT语句时,它表明了要使用什么编码集去解析列值。)
一条SET NAMES '%charset_name%'语句等价于如下三条语句:
SET character_set_client = %charset_name%;
SET character_set_results = %charset_name%;
SET character_set_connection = %charset_name%;
设置character_set_connection为%charset_name%的同时,也隐式地设置了collation_connection为%charset_name%的默认collation。没有必要去显式地设置默认值的collation。
如果想要指定特别的collation,可以使用可选的COLLATE参数:
SET NAMES '%charset_name%' COLLATE '%collation_name%'
2.SET CHARATER SET %charset_name%
SET CHARATER SET 与 SET NAMES 相似,只是把character_set_database和collation_database的值设置到了character_set_connection和collation_connection上。一条
SET CHARACTER SET %charset_name%语句等价于如下三条语句:
SET character_set_client = %charset_name%;
SET character_set_results = %charset_name%;
SET collation_connection = @@collation_database;
设置collation_connection同样也隐式地把character_set_connection设置成了collation相关的编码集(等价于执行了SET character_set_connection = @@character_set_database)。
没有必要去显式地设置character_set_connection。
注意:
ucs2,utf16,utf16le 和 utf32不能被用作客户端的编码集,也就意味着 SET NAMES 或者 SET CHARACTER SET 对这些编码集无效。
MySQL客户端程序,mysql,mysqladmin,mysqlcheck,mysqlimport 和 mysqlshow 决定了默认编码集按照如下方式使用:
1.在没有其他信息时,程序使用汇编默认的编码集,通常是latin1。