php里有三套操作mysql的库,分别是自带的mysql系列函数、mysqli和mysqlpdo。这三套库的下层又使用了两个数据操作引擎,分别是libmysql和mysqlnd,具体使用哪个引擎由php编译时决定。
在实际使用这三个库的时候,存在一个小的问题,就是连接字符串的写法。对于host:port的格式,在libmysql中和mysqlnd中支持情况有差异。所以如果你使用了这种写法又切换了引擎或者使用的库,则可能导致问题。
下面结合新浪云计算SAE中的数据库操作列举一下各种情况,如非说明,默认均是libmysql环境下,具体是:php内置mysql函数的正确写法:
[php] view plaincopy
mysql_connect('127.0.0.1:3306', $user, $password);
其中第一个参数是host:port格式,libmysql引擎、mysqlnd和SAE均支持这种格式的写法。
官方的说明在:http://cn2.php.net/manual/en/function.mysql-connect.php
mysqli中的正确写法:
[php] view plaincopy
$conn = new mysqli("127.0.0.1", $user, $pwd, $db, "3306");
如果写成:
$conn = mysqli_connect('127.0.0.1:3306', $user, $password);
或:
$conn = new mysqli("127.0.0.1:3306", $user, $pwd);
其中第一个参数是host:port格式,原生mysqli不支持这种写法,在SAE中支持此写法。
官方的说明在:http://cn2.php.net/manual/en/function.mysqli-connect.php
pdomysql中的正确写法:
[php] view plaincopy
$conn= new PDO('mysql:host=127.0.0.1;port=3306', $user, $password);
原生mysqlpdo和SAE均支持此写法。
如果写成:
$conn= new PDO('mysql:host=127.0.0.1:3306', $user, $password);
原生mysqlpdo和SAE均不支持此种写法。但是在mysqlnd引擎环境下,支持此写法。
官方的说明在:http://cn2.php.net/manual/en/pdo.construct.php
综上得到针对host:port格式的支持情况的列表:
libmysql引擎下:
mysql:支持
mysqli:不支持(SAE中做了支持)
mysqlpdo:不支持
mysqlnd引擎下:
mysql:支持
mysqli:支持
mysqlpdo:支持
结论:php中操作mysql数据库的时候,从兼容性角度考虑,最好明确指示port参数,而不要使用冒号分隔的缩写写法。