MySQL和MySQLi哪个更好?为什么?我应该使用哪一个?
我指的不仅仅是性能,还包括其他相关功能。
有一个专门帮助选择mysql、mysqli和PDO的手册页面,它位于:
PHP团队建议新开发使用mysqli或PDO_MySQL扩展:
建议使用mysqli或PDO_MySQL扩展,不推荐使用旧的mysql扩展进行新开发。以下提供了详细的功能比较矩阵。三个扩展的整体性能被认为是相同的。虽然扩展的性能只对PHP Web请求的总运行时间产生一小部分影响,通常影响仅为0.1%。
该页面还通过特性矩阵比较了这些扩展API。mysqli和mysql API之间的主要区别如下:
mysqli mysql
Development Status Active Maintenance only
Lifecycle Active Long Term Deprecation Announced*
Recommended Yes No
OOP API Yes No
Asynchronous Queries Yes No
Server-Side Prep. Statements Yes No
Stored Procedures Yes No
Multiple Statements Yes No
Transactions Yes No
MySQL 5.1+ functionality Yes No
* http://news.php.net/php.internals/53799
这里还有一个特性矩阵,比较了新的mysqlnd和libmysql库的区别:
以及一篇非常详尽的博客文章:
我已经放弃使用mysqli了,因为它太不稳定了。我曾经用mysqli查询过程中导致PHP崩溃,但是使用mysql包却可以正常工作。此外,mysqli在LONGTEXT列上会崩溃。自2005年以来,这个问题以各种形式被提出,但仍然存在问题。我很想使用预处理语句,但mysqli并不可靠(似乎没有人愿意修复它)。如果你真的需要预处理语句,请使用PDO。
MySQLi代表MySQL改进版。它是MySQL绑定的面向对象接口,使使用更加容易。它还提供预处理语句的支持(这非常有用)。如果您使用的是PHP 5,请使用MySQLi。
更好的选择是PDO;它提供了一个更简洁的接口,同时也提供了与MySQLi相同的功能。
使用预处理语句是好的,因为它消除了SQL注入的可能性;但是使用服务器端预处理语句是不好的,因为它会增加往返次数。
对我来说,预处理语句是一个必备的功能。更确切地说,参数绑定(仅适用于预处理语句)。这是将字符串插入SQL命令的唯一真正明智的方法。我真的不信任“转义”函数。数据库连接是二进制协议,为什么要使用ASCII限制的子协议来传递参数?
mysql_*()
已经过时,而且很快将被删除。你不应该在新代码中使用它。 - user1864610