如何使用PDO从MySQL获取数字类型数据?
问题的原因:PDO在默认情况下对所有MySQL连接使用模拟准备语句。而要获得原生数据类型,必须使用真正的准备语句。另外,还需要确保未将PDO::ATTR_STRINGIFY_FETCHES设置为true。
解决方法:
1. 确保安装并激活mysqlnd。可以通过运行php --info
来查看pdo_mysql部分的信息,其中的Client API version应该显示为mysqlnd。
2. 将PDO::ATTR_EMULATE_PREPARES设置为false,以使用真正的准备语句。代码示例:$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
3. 确保未将PDO::ATTR_STRINGIFY_FETCHES设置为true。代码示例:$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
需要注意的是,即使按照上述配置,DECIMAL类型仍将作为字符串发送。这是为了防止在PHP中变为不可靠的浮点数。
问题的出现原因是在PHP 5.2版本中无法直接获取MySQL中的数值类型。而在PHP 5.3版本中,使用新的mysqlnd(MySQL Native Driver)驱动可以实现这一功能。
解决方法是安装php5-mysqlnd扩展包,可以通过在Ubuntu中运行命令"sudo apt-get install php5-mysqlnd"来安装。另外,在PHP 7上的CentOS/RHEL系统中,可以通过运行命令"yum install php70w-mysqlnd"来安装php70w-mysqlnd扩展包。
此外,还可以在PHP端使用一个映射系统(如ORM)来将从数据库中获取的结果转换为PHP的数据类型。这种方法可以使用Doctrine等ORM框架来实现。
这个默认行为的原因以及为什么会对整数类型有影响,对我来说仍然是个谜。
在使用PDO连接MySQL时,通常会将数字作为字符串返回。然而,如果我们想要返回原生的数字类型,可以通过关闭PDO的预处理语句模拟来实现。具体做法是在创建PDO对象时,将PDO::ATTR_EMULATE_PREPARES参数设置为false。
代码示例:
new PDO($dsn, $user, $pass, array( PDO::ATTR_EMULATE_PREPARES => false ))
此外,需要注意的是,PDO::ATTR_STRINGIFY_FETCHES属性与MySQL无关。
如果我们知道某个字段应该是数字类型,可以通过将该字段加上0来强制将其转换为数字类型。这种方法适用于所有的PHP版本。
代码示例:
$values = $stm->fetch(); $values['numfield'] += 0; // 强制将值转换为数字类型
通过以上方法,我们可以正确地获取MySQL中的数字类型。