如何使用PDO从MySQL获取数字types?

我正在使用PDO和MySQL,出于某种原因从数据库中获取值为inttypes的值时,PDOStatement返回的是数字的string表示forms,而不是数值types的值。 我如何防止这种情况发生?

我注意到有一个PDO类的属性: PDO::ATTR_STRINGIFY_FETCHES应该照顾这个,但是,当试图修改它,它会抛出一个错误,说该属性是无效的MySQL驱动程序。

咨询数据库时,获取string而不是数字是否正常?

我不认为有“数字”可以在PHP 5.2中完成🙁

在PHP 5.3中,如果我没有记错的话,当你使用新的(PHP> = 5.3中的新的) mysql nd (MySQL本地驱动程序)驱动程序时,就成为可能。

那么,经过我的书签更多的挖掘,我发现这篇文章关于mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

它说这(引号):

使用mysqlnd进行PDO的优点

当使用服务器端Prepared Statements时,mysqlnd返回本地数据types,例如INT列作为整型variables而不是string返回。 这意味着内部更less的数据转换。

但是,这只是PHP 5.3(假定你的PHP 5.3版本是用mysqlnd( 而不是旧的libmysql)编译的),而且似乎只是准备语句的情况:-(

抱歉…

一个解决scheme是在PHP端有一个映射系统(就像ORM – 参见Doctrine ;就像ORM的一个例子:我不知道它是否按你所要求的)来转换结果从数据库到PHP数据types…

是的,如果你想使用像===!==这样的types敏感的操作符,这是不好的…

要回答你的最后一个问题,“是的”,不幸的是,接收数字作为string是正常的。 正如Pascal引用的手册所述,如果您从PDOclosures准备好的语句仿真,mysqlnd(PHP 5.3)将从预准备语句中返回本机数据types。

 new PDO($dsn, $user, $pass, array( PDO::ATTR_EMULATE_PREPARES => false )) 

PDO :: ATTR_STRINGIFY_FETCHES与MySQL无关。

如果你看好的话,最好是使用预先准备好的语句,所以…;)

帕斯卡的回答是正确的。 我有一些麻烦,使所有的工作。 这是你需要做的。

首先,确保你已经安装并激活了mysqlnd。 看看php --info 。 在pdo_mysql部分,它应该如下所示:

 pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321 

如果不是在客户端API版本中看到mysqlnd ,您会看到类似…

 Client API version => 5.5.29 

…然后你没有安装mysqlnd。 先照顾那个

其次,PDO 默认为所有MySQL连接使用模拟的准备语句。 可笑,但它是。 只有使用真正准备的语句(在链接的博客post中称为“服务器端准备好的语句”,现在就在这里 ),您将获得本地数据types。 所以你必须设置PDO :: ATTR_EMULATE_PREPARES为false,如下所示:

 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

最后,确保您没有将PDO :: ATTR_STRINGIFY_FETCHES设置为true。

 $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 

你可能已经安装了mysqlnd ,但这并不意味着它可以被普通的PDO扩展使用(pdo_mysql) ,在共享主机上更常见,所以一定要启用nd_pdo_mysql扩展,并且禁用其他的扩展pdo_mysql因为它可能会产生冲突。

@screenshot

在这里输入图像描述

我发现这个(重复)的问题 ,决定在这里发表我的想法,希望它的罚款;)