nd_pdo_mysql和pdo_mysql扩展有什么区别?

10
由于某些原因,我们托管的服务器上的pdo_mysql PHP扩展无法运行使用MySQL视图的查询,并显示以下错误消息:

SQLSTATE [HY000]:General error: 1615 Prepared statement needs to be re-prepared

(有关Bug #42041 Prepared-Statement fails when MySQL-Server under load的讨论以及Stack Overflow上的众多问题。)
出于某种原因,如果我们切换到使用针对MySQL Native Driver(mysqlnd)的nd_pdo_mysql扩展,使用视图的查询就可以正常运行。 pdo_mysqlnd_pdo_mysql之间有什么区别?为什么会选择其中一个?
谢谢。

1
这可能会有所帮助:https://secure.php.net/manual/zh/mysqlnd.overview.php - Hayden Schiff
@HaydenSchiff,谢谢你的回复,但是链接的文章似乎与pdo驱动程序无关。还有其他人能帮忙解释一下pdo_mysql和nd_pdo_mysql驱动程序之间的区别吗? - user2340816
我不熟悉“nd_pdo_mysql”这个术语。后端库通常会被编译到PHP中,这不是你可以在运行时选择的东西。你是否使用了一些第三方PHP发行版? - Álvaro González
4
谷歌到这里的人:nd_pdo_mysql 看起来是由 cPanel 托管平台提供的自定义可插拔扩展,用于在运行时选择 MySQL Native Driver。在常规的 PHP 设置中,MySQL 驱动程序是在编译时选择的,不能在之后更改,因此 pdo_mysql 是唯一可用的扩展,不涉及驱动程序的任何内容。 - Álvaro González
1个回答

17

要从PHP连接到您的MySQL服务器,有两个版本的驱动程序:

  1. mysqlnd
  2. libmysql

为了使用 mysqlnd 驱动程序连接到您的MySQL服务器,您需要使用 nd_pdo_mysql 扩展,如下面截图所示。

enter image description here

由于 libmysql 将数字类型返回为字符串,因此我使用 mysqlndnd_pdo_mysql 以获取本机/严格数据,这样数字类型就不会作为字符串返回。

来自MySQL官方网站: https://dev.mysql.com/downloads/connector/php-mysqlnd/

PHP的MySQL本地驱动程序 mysqlnd 是MySQL客户端库 libmysql 的可插拔替换物。


2
由于libmysql将数字类型返回为字符串,我使用mysqlnd与nd_pdo_mysql以获取本机/严格数据,以便数字类型不会作为字符串返回。----- 我在其他地方没有找到这些信息,现在很高兴能够理解为什么选择使用nd_pdo_mysql而不是pdo_mysql。谢谢。 - user2340816
这个截图属于哪个软件? - Álvaro González
2
它来自cPanel。 - AamirR
1
非常有帮助的答案,还要记得在PDO选项中设置PDO :: ATTR_EMULATE_PREPARES = false和PDO :: ATTR_STRINGIFY_FETCHES = false。 - user356417

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