使用 PHP 时的 MySQL 与 MySQLi [已关闭]

MySQL vs MySQLi when using PHP [closed]

提问人:Anand 提问时间:2/14/2009 最后编辑:DharmanAnand 更新时间:10/27/2019 访问量:232198


答:

5赞 MarkR 2/14/2009 #1

更好的是PDO;它是一个不那么粗糙的界面,并且还提供与 MySQLi 相同的功能。

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

13赞 Ross 2/14/2009 #2

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

114赞 Mark Davidson 2/14/2009 #3

如果你看一下MySQL改进的扩展概述,它应该告诉你你需要知道的关于两者之间差异的所有信息。

主要有用的功能是:

  • 面向对象的界面
  • 支持预准备语句
  • 支持多个语句
  • 支持交易
  • 增强的调试功能
  • 嵌入式服务器支持。

评论

1赞 jondinham 10/22/2011
是的,最好的事情是MySQLI支持预准备语句
8赞 zneak 1/4/2013
还应该注意的是,MySQLi仅适用于MySQL 5+。这已经无关紧要了,但是当MySQLi问世时,MySQL 4仍然是标准。这是扩展分开的部分原因,旧的MySQL驱动程序出于兼容性目的而保留在那里。
8赞 5/21/2015
值得注意的是,六年来情况发生了很大变化。 现已弃用,并将很快删除。不应将其用于新代码。mysql_*()
0赞 Mahdi Jazini 10/5/2015
我们应该选择哪个 CPU 和 RAM 更少?
1赞 Mark Davidson 10/5/2015
请参阅下面的 Gordon 的回答。不再支持旧的 mysql 扩展,因此无论如何您最好使用 mysqli 扩展。
3赞 Javier 2/14/2009 #4

对我来说,准备好的陈述是必不可少的功能。更准确地说,是参数绑定(仅适用于预准备语句)。这是将字符串插入 SQL 命令的唯一真正合理的方法。我真的不相信“逃逸”功能。数据库连接是二进制协议,为什么要对参数使用 ASCII 限制的子协议?

评论

1赞 MarkR 2/15/2009
PDO 通常使用客户端预准备语句,因此它们并没有真正在服务器上准备好 - 但这很好,因为它可以节省服务器资源并且通常性能更好。准备好的语句“仿真”将始终正确地转义。
1赞 Javier 2/16/2009
“总是”和“逃避”放在一起是危险的词。我不知道,也许这段代码完全没有错误;但是,当真正的二进制协议可用时,为什么还要麻烦呢?至于性能,这是可以进行基准测试的。
15赞 cletus 2/14/2009 #5

我已经放弃了使用mysqli。它实在是太不稳定了。我遇到过使用 mysqli 使 PHP 崩溃的查询,但与 mysql 包一起工作得很好。此外,mysqli 在 LONGTEXT 列上崩溃。至少自 2005 年以来,这个错误一直以各种形式出现,并且仍然被破坏。老实说,我想使用准备好的语句,但 mysqli 不够可靠(而且似乎没有人费心修复它)。如果您真的想要准备好的语句,请使用 PDO。

评论

2赞 troelskn 2/14/2009
PDO也不是完全完美的(我遇到过一些讨厌的核心转储),但至少它有更广泛的用户群,所以它可能是一个更安全的选择。
0赞 Pacerier 7/16/2013
@troelskn,那么普通的mysql不是更好吗?
0赞 troelskn 7/17/2013
@Pacerier 考虑到它已被弃用,我会说不。总的来说,PDO似乎已成为标准选择。
0赞 Pacerier 7/18/2013
@troelskn,但弃用并不意味着什么,只是它不会出现在未来的版本中。在稳定性方面,普通的mysql不是更稳定吗?
1赞 troelskn 7/19/2013
此时(5.5),如果您使用它,PHP 将主动发出警告: php.net/manual/en/migration55.deprecated.php
71赞 Gordon 1/17/2012 #6

有一个手册页专门用于帮助在 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

还有一个额外的功能矩阵比较库(new mysqlnd 与 libmysql),位于

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