使用PHP时的MySQL vs MySQLi [关闭]


167

MySQL还是MySQLi哪个更好?又为什么呢 我应该使用哪个?

我的意思是不仅在性能方面,而且在其他任何相关功能方面也更好。

Answers:


111

如果您查看MySQL改进的扩展概述,它应该告诉您关于两者之间的区别所需的所有知识。

主要有用的功能是:

  • 面向对象的接口
  • 支持准备好的陈述
  • 支持多条语句
  • 支持交易
  • 增强的调试功能
  • 嵌入式服务器支持。

1
是的,最好的是mysqli支持预处理语句
jondinham 2011年

7
还应该注意的是,MySQLi仅适用于MySQL 5+。这不再是真正的相关性,但是当MySQLi发布时,MySQL 4仍然是标准。这是扩展是分开的原因的一部分,而旧的MySQL驱动程序出于兼容性目的而保留在那里。
zneak

6
值得注意的是,六年来情况发生了很大变化。mysql_*()现在已弃用,很快将被删除。您不应将其用于新代码。

我们应该选择CPU和RAM较少的哪个?
Mahdi Jazini

1
请参阅下面的戈登答案。不再支持旧的mysql扩展,因此无论如何您最好使用mysqli扩展。
马克戴维森

70

有一个手册页专门帮助您在以下位置选择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年以来,该bug已经以各种形式提出,并一直被打破。老实说,我想使用准备好的语句,但是mysqli不够可靠(而且似乎没有人去解决它)。如果您真的想要准备好的语句,请使用PDO。


2
PDO也不是完美的(我已经遇到过一些讨厌的转储),但是至少它拥有更广泛的用户群,所以这可能是一个更安全的选择。
troelskn

@troelskn,所以普通的mysql不是更好吗?
Pacerier

@Pacerier考虑到它已被弃用,我会说不。通常,PDO似乎已成为标准选择。
troelskn

@troelskn,但已弃用并不意味着任何东西,只是在将来的版本中不再存在。在稳定性方面,普通的mysql是否更稳定?
Pacerier

1
此时(5.5)如果您使用PHP,它将主动发出警告:php.net/manual/en/migration55.deprecated.php
troelskn

13

MySQLi代表MySQL经过改进。它是MySQL绑定的面向对象的界面,使事情变得更易于使用。它还为准备好的语句提供支持(非常有用)。如果您使用的是PHP 5,请使用MySQLi。


5

PDO更好。它的界面不那么笨拙,并且提供与MySQLi相同的功能。

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


3

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


1
PDO通常使用客户端准备好的语句,因此它们不是在服务器上真正准备好的-但这很好,因为它可以节省服务器资源并且通常性能更好。准备好的语句“仿真”将始终正确地转义。
MarkR

1
在一起时,“总是”和“逃避”是危险的词。我不知道,也许这段代码是完全没有错误的;但是当真正的二进制协议可用时,为什么还要打扰呢?至于性能,则可以进行基准测试。
哈维尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.