最近公司组织了个PHP安全编程的培训,其中涉及到一部分关于MysqL的”SET NAMES”和MysqL_set_charset (MysqLi_set_charset)的内容:
说到,尽量使用MysqLi_set_charset(MysqLi:set_charset)而不是”SET NAMES”,当然,这个内容在PHP手册中也有叙及,但是却没有解释为什么.
最近有好几个朋友问我这个问题,到底为什么?
问的人多了,我也就觉得可以写篇blog,专门介绍下这部分的内容了.
首先,很多人都不知道”SET NAMES”到底是做了什么,
我之前的文章深入MysqL字符集设置中,曾经介绍过character_set_client/character_set_connection/character_set_results这三个MysqL的”环境变量”,这里再简单介绍下,
这三个变量,分别告诉MysqL服务器,客户端的编码集,在传输给MysqL服务器的时候的编码集,以及期望MysqL返回的结果的编码集.
比如,通过使用”SET NAMES utf8″,就告诉服务器,我用的是utf-8编码,我希望你也给我返回utf-8编码的查询结果. 一般情况下,使用”SET NAMES”就足够了,也是可以保证正确的. 那么为什么手册又要说推荐使用MysqLi_set_charset(PHP>=5.0.5)呢?
首先,我们看看MysqLi_set_charset到底做了什么(注意星号注释处,MysqL_set_charset类似):
<div class="codetitle"><a style="CURSOR: pointer" data="13073" class="copybut" id="copybut13073" onclick="doCopy('code13073')"> 代码如下: