只需阅读Stefan Gehrig对Is "SET CHARACTER SET utf8" necessary?的优秀回答,它在解释解释和运行查询w.r.t的各个阶段方面比MySQL的文档走得更远。字符集和排序规则,但是我仍然不能真正理解character_set_connection的用途,或者更具体地说,将语句从character_set_client转换为character_set_connection。
为什么不直接使用character_set_client进行查询,并在与列值进行比较时直接从character_set_client转码到列的字符集?这个中间阶段的目的是什么?手册中给出了比较文本字符串的示例,但是为什么您首先要这样做,更不用说在与character_set_client相反的character_set_connection中了?除非我对此的理解是错误的(比如"select 'somestr‘= 'somestr’from x")。
谢谢。
发布于 2013-11-14 18:17:54
在阅读了答案和文档后,我只能想到character_set_connection (和_collation)的一个用例:
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无关紧要,因为列有自己的排序规则,排序规则优先级更高。
发布于 2013-06-24 13:00:18
这两者的不同之处在于,假设character_set_client是从客户端发送语句的字符集,因此服务器用来解释语句的字符集,而character_set_connection是服务器转换语句以进行处理的字符集。
如前所述,character_set_connection用于文本字符串的比较。然而,这并不意味着等式的两端都必须是文字字符串。例如:
WHERE column_name = 'literal_string'
(charset col) (charset connection)如果列和连接的字符集不同,则比较是非法的,并将导致错误。
然后将结果(和和响应消息)编码到character_set_results中,以便发送回客户端。
发布于 2013-09-30 17:45:10
这是因为MySQL允许每个字符串字面值都有自己的字符集。也就是说,语句中的字符串文字字符集并不总是与语句中的字符串文字字符集相同。
请参阅手册中的页面:http://dev.mysql.com/doc/refman/5.5/en/charset-literal.html
https://stackoverflow.com/questions/16082480
复制相似问题