character_set_connection的目的是什么?

时间:2013-04-18 12:05:03

标签: mysql character-encoding

请阅读Stefan Gehrig对Is "SET CHARACTER SET utf8" necessary?的出色答案,该答案比MySQL的文档更进一步解释了解释和运行查询的阶段w.r.t.字符集和排序规则,但我仍然无法真正看到character_set_connection的用途,或者更具体地说,将character_set_client中的语句转码为character_set_connection。

为什么不直接使用character_set_client进行查询,并在与列值进行比较时直接从character_set_client转码到列的字符集?这个中间阶段的目的是什么?本手册给出了比较文字咒语的例子,但为什么你想首先做这个,更不用说在character_set_connection中与character_set_client相反?除非我对此的理解(类似于“选择'somestr'='somestr'来自x”)是错误的。

谢谢。

4 个答案:

答案 0 :(得分:6)

阅读完答案和文档后,我只能想到character_set_connection(和_collation)的一个用例:

  

SELECT“StringA”< “StringB”

character_set_client仅对转移到服务器有用。 character_set_connection(以及与字符集无关的排序规则)对语句的解释很重要。 “StringA”是否小于“StringB”取决于文字的字符集和整理。开发人员可能会选择与character_set_client不同的字符集/归类。

实际上,character_set_connection在大多数情况下都无关紧要,因为文字会与列进行比较,在这种情况下会使用列的字符集和排序规则。

如果我错了,请纠正我!

请参阅https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

  

服务器应该将语句转换为之后的字符集   收到了吗?为此,服务器使用character_set_connection   和collat​​ion_connection系统变量。它转换发送的语句   由客户端从character_set_client到character_set_connection   (除了具有导入器的字符串文字,例如_latin1或   _utf8)。 collat​​ion_connection对于文字字符串的比较很重要。对于字符串与列值的比较,   collat​​ion_connection无关紧要,因为列有自己的   整理,具有更高的整理优先权。

答案 1 :(得分:1)

两者的不同之处在于character_set_client被假定为从客户端发送语句的字符集,因此服务器用来解释语句的字符集,而character_set_connection是什么服务器将语句转换为进行处理。

如上所述,

character_set_connection用于比较文字字符串。然而,这并不意味着等式的两边都必须是字符串。例如:

WHERE column_name = 'literal_string'
     (charset col)  (charset connection)

如果列的字符集和连接不同,则比较是非法的,将导致错误。

然后将结果(和响应消息)编码到character_set_results中,以便发送回客户端。

答案 2 :(得分:0)

这是因为MySQL允许每个字符串文字都有自己的字符集。也就是说,语句中字符串文字的字符集并不总是与语句的字符集相同。

请参阅手册中的此页:http://dev.mysql.com/doc/refman/5.5/en/charset-literal.html

答案 3 :(得分:-1)

> <?php

// ... (create a connection to mysql) ...

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);

$re = mysql_query('SHOW VARIABLES LIKE "%character_set%";')or die(mysql_error());
while ($r = mysql_fetch_assoc($re)) 
{
    var_dump ($r); echo "<br />";
} 

exit;

?>

所有重要的变量现在都是utf-8,我们可以安全地使用INSERT或SELECT与mysql_escape_string($ var),而无需任何编码功能。