PHP5.2.3以上的环境中尽量不要使用SET NAMES设置Mysql编码

从php5.2.3以及mysql5.0.7之后SET NAMES 'utf8'这类语句将不再建议使用,而尽量要使用mysql_set_charset()函数。
如:

$conn = mysql_connect('127.0.0.1', 'root', '');
mysql_query('SET NAMES utf8' ,$conn);

此代码要修改为:

$conn = mysql_connect('127.0.0.1', 'root', '');
mysql_set_charset('uft8', $conn);

其中utf8也可以是gbk或代码页,如cp936。

该改变在PHP5.2.3的手册中有关mysql_set_charset()上已经声明:
http://cn.php.net/manual/zh/function.mysql-set-charset.php

删除该用法,一来可以避免SQL注入,二来我们来看如下完整程序:

";
//使用set names 告诉MySQL服务器, 客户端的编码
mysql_query('SET NAMES gbk' ,$conn);
echo mysql_client_encoding() . "
"; mysql_query('SET NAMES cp936' ,$conn); echo mysql_client_encoding() . "
"; mysql_query('SET NAMES utf8' ,$conn); echo mysql_client_encoding() . "
"; mysql_set_charset('gbk'); echo mysql_client_encoding() . "
"; mysql_set_charset('cp936'); echo mysql_client_encoding() . "
"; mysql_set_charset('utf8'); echo mysql_client_encoding() . "
"; ?>

执行结果如下:
latin1
latin1
latin1
latin1
gbk
gbk
utf8

其实用的set names 只是告诉mysql要进行具体编码,mysql还要做一次转换,效率有所折扣。

所以各位在PHP5.2.3以上的环境中尽量不要再使用 SET NAMES 'XXX'.

发表评论