PHP使用MySQL和MySQLi之间的区别

171

MySQL和MySQLi哪个更好?为什么?我应该使用哪一个?

我指的不仅仅是性能,还包括其他相关功能。

6个回答

114
如果您查看MySQLi 改进扩展概述,就可以了解有关两者之间差异的所有信息。
主要有用特性包括:
  • 面向对象接口
  • 支持预处理语句
  • 支持多语句
  • 支持事务
  • 增强的调试能力
  • 嵌入式服务器支持。

1
是的,最好的事情是mysqli支持预处理语句。 - jondinham
8
值得注意的是,MySQLi仅适用于MySQL 5+。虽然这已经不太相关了,但当MySQLi面世时,MySQL 4仍然是标准。这也是为什么这两个扩展是分开的原因之一,旧的MySQL驱动程序仍然存在是为了保持兼容性。 - zneak
8
值得注意的是,六年间情况发生了很大变化。mysql_*()已经过时,而且很快将被删除。你不应该在新代码中使用它。 - user1864610
我们应该选择哪个占用更少 CPU 和 RAM 的选项? - Mahdi Jazini
1
请参考Gordon的回答。旧版的mysql扩展已经不再受支持,因此最好使用mysqli扩展。 - Mark Davidson
@user1864610 它在 PHP 7 中被移除了。 - ReinstateMonica3167040

71

有一个专门帮助选择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库的区别:

以及一篇非常详尽的博客文章:


15

我已经放弃使用mysqli了,因为它太不稳定了。我曾经用mysqli查询过程中导致PHP崩溃,但是使用mysql包却可以正常工作。此外,mysqli在LONGTEXT列上会崩溃。自2005年以来,这个问题以各种形式被提出,但仍然存在问题。我很想使用预处理语句,但mysqli并不可靠(似乎没有人愿意修复它)。如果你真的需要预处理语句,请使用PDO。


2
PDO 也并非完美无缺(我曾经遇到过一些令人头疼的核心转储问题),但至少它拥有更广泛的用户群,因此可能是一个更安全的选择。 - troelskn
@troelskn,那普通的MySQL不是更好吗? - Pacerier
@Pacerier 考虑到它已经被弃用了,我会说不要使用。总的来说,看起来PDO已经成为了标准选择。 - troelskn
1
在 PHP 版本 5.5 中,如果您使用它,PHP 将主动发出警告:http://php.net/manual/zh/migration55.deprecated.php - troelskn
截至2015年,这仍然是最先进的技术吗? - icedwater
显示剩余2条评论

13

MySQLi代表MySQL改进版。它是MySQL绑定的面向对象接口,使使用更加容易。它还提供预处理语句的支持(这非常有用)。如果您使用的是PHP 5,请使用MySQLi。


5

更好的选择是PDO;它提供了一个更简洁的接口,同时也提供了与MySQLi相同的功能。

使用预处理语句是好的,因为它消除了SQL注入的可能性;但是使用服务器端预处理语句是不好的,因为它会增加往返次数。


3

对我来说,预处理语句是一个必备的功能。更确切地说,参数绑定(仅适用于预处理语句)。这是将字符串插入SQL命令的唯一真正明智的方法。我真的不信任“转义”函数。数据库连接是二进制协议,为什么要使用ASCII限制的子协议来传递参数?


1
PDO通常使用客户端准备的语句,因此它们并不是真正在服务器上准备的 - 但这很好,因为它节省了服务器资源并且通常表现更好。预处理语句的“模拟”将始终正确地转义内容。 - MarkR
1
“always”和“escaping”一起使用时是危险的词。我不知道,也许这段代码完全没有bug;但为什么要费心呢,当一个真正的二进制协议可用时?至于性能,那就需要进行基准测试了。 - Javier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接