我使用PDO和MySQL,由于某些原因,当从数据库中获取整型的值时,PDOStatement返回的是数字的字符串表示,而不是数字类型的值。如何防止这种情况发生?
我注意到PDO类有一个属性:PDO::ATTR_STRINGIFY_FETCHES
,它应该处理这个问题,但是,当试图修改它时,它抛出一个错误,指出该属性对MySQL驱动程序无效。
在查询数据库时获取字符串而不是数字是正常的吗?
发布于 2009-07-29 00:08:30
首先回答您的最后一个问题:“是”。不幸的是,以字符串形式接收数字是很正常的。正如Pascal引用的手册所说,mysqlnd (PHP5.3)将从预准备语句返回本机数据类型,前提是您从PDO关闭了预准备语句模拟。
new PDO($dsn, $user, $pass, array(
PDO::ATTR_EMULATE_PREPARES => false
))
PDO::ATTR_STRINGIFY_FETCHES与MySQL无关。
如果从好的方面来看,不管怎样,使用准备好的语句是一个很好的实践,所以...;)
发布于 2013-03-24 06:26:54
Pascal's answer是正确的。我遇到了一些麻烦,使它所有的工作。这是你需要做的。
首先,确保您已经安装并激活了mysqlnd。看看php --info
吧。在pdo_mysql部分中,它应该如下所示:
pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321
如果您看到的不是Client API版本中的mysqlnd
,而是下面这样的行...
Client API version => 5.5.29
...then你还没有安装mysqlnd。先处理好这件事。
其次,PDO使用模拟的预准备语句by default for all MySQL连接。很可笑,但事实就是如此。而且,只有在使用真正的预准备语句(在链接的博客文章中称为“服务器端预准备语句”,现在是here)时,您才能获得原生数据类型。因此,必须将PDO::ATTR_EMULATE_PREPARES设置为false,如下所示:
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
最后,确保您没有将PDO::ATTR_STRINGIFY_FETCHES设置为true。
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
发布于 2017-07-28 14:21:23
你可能已经安装了mysqlnd
,但这并不意味着它可以被常规的PDO
扩展(pdo_mysql)
使用,这在共享主机上更常见,所以请确保启用nd_pdo_mysql
扩展,并禁用其他扩展pdo_mysql
,因为它可能会产生冲突。
@截图
我发现了这个(复制的) question,决定在这里发表我的想法,希望它是好的;)
https://stackoverflow.com/questions/1197005
复制相似问题