19

只需阅读 Stefan Gehrig 对“SET CHARACTER SET utf8”是否有必要的出色回答,在解释解释和运行查询 wrt 字符集和排序规则的阶段时,它比 MySQL 的文档更进一步,但我仍然看不到 character_set_connection 的目的,或者更具体地说,将语句从 character_set_client 转码为 character_set_connection。

为什么不直接使用 character_set_client 进行查询,并在与列值进行比较时直接从 character_set_client 转码为列的字符集?这个中间阶段的目的是什么?该手册给出了比较文字刺痛的示例,但是为什么您首先要这样做,更不用说在 character_set_connection 中与 character_set_client 对立了?除非我对此的理解(例如“select 'somestr' = 'somestr' from x”)是错误的。

谢谢你。

4

4 回答 4

7

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

选择“字符串A”<“字符串B”

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 无关紧要,因为列有自己的排序规则,它具有更高的排序规则优先级。

于 2013-11-14T10:17:53.950 回答
1

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

character_set_connection如前所述,用于比较文字字符串。但是,这并不一定意味着等式的两边都必须是文字字符串。例如:

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

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

然后将结果(和响应消息)编码character_set_results为发送回客户端。

于 2013-06-24T05:00:17.557 回答
1

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

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

于 2013-09-30T09:45:09.803 回答
-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,我们可以安全地使用带有 mysql_escape_string($var) 的 INSERT 或 SELECT,而无需任何编码函数。

于 2013-11-06T11:47:41.520 回答