请阅读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”)是错误的。
谢谢。
答案 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 和collation_connection系统变量。它转换发送的语句 由客户端从character_set_client到character_set_connection (除了具有导入器的字符串文字,例如_latin1或 _utf8)。 collation_connection对于文字字符串的比较很重要。对于字符串与列值的比较, collation_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),而无需任何编码功能。