mysql中character_set_connection的作用

character_set_client = x 
character_set_results = x
character_set_connection = x;

我们常用在mysql操作类中使用这三面,下面大概说下作用:

  character_set_client 客户端使用的编码,如GBK, UTF8 比如你写的sql语句是什么编码的。
  character_set_results 查询返回的结果集的编码(从数据库读取的数据是什么编码的)。
  character_set_connection 连接使用的编码

它们之前存在一个转换过程(具本的还请见手册):

character_set_client -> character_set_connection >内部操作字符集->character_set_results
见一篇文章:http://www.cnblogs.com/discuss/articles/1862248.html
如:utf8->utf8->utf8  gbk->utf8->utf8

类似于gbk->utf8->utf8这样的转换,有些同学可能有个疑问:
  character_set_client 是gbk
  character_set_connection 是utf8
  character_set_results 也是utf8
  
  为什么不滤过character_set_connection部分,而它在这个中间阶段起到一个什么样的作用。
google时,http://stackoverflow.com/questions/16082480/what-is-the-purpose-of-character-set-connection
老外也提到过样的问题,本人英语差得很,也没怎么看完,最后转而去看手册去了。

在手册中发现一句话:转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。
请反复读下这段话,尤其是红色部分。现在说下我的理解:我们操作数据库时,大多于表有关,但是并不是说操作数据库一定要于表有关,如果使用表,则表和字段的字符集有优先,比如直接select length('中国人'),如果
character_set_connection是utf8的则输出9,如果是gbk则输出6。各位可以通过修改字符集变量测试下。我想character_set_connection存在的意义大多是类似于此类用法吧。


如有说的不对的地方,请指正下,或者有更多的说法,也请说下。
posted @ 2015-02-07 11:18  一枪把世界杀了  阅读(8565)  评论(0编辑  收藏  举报