如何使用PDO从MySQL获取数字类型数据?

25 浏览
0 Comments

如何使用PDO从MySQL获取数字类型数据?

我正在使用PDO和MySQL,在从数据库获取int类型的值时,PDOStatement返回的是数字的字符串表示,而不是数值类型的值。我该如何防止这种情况发生?

我注意到PDO类有一个属性:PDO::ATTR_STRINGIFY_FETCHES,它应该能解决这个问题,但是在尝试修改它时,它抛出一个错误,说这个属性对于MySQL驱动程序无效。

在查询数据库时,得到字符串而不是数字,这是正常的吗?

0
0 Comments

问题的原因: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中变为不可靠的浮点数。

0
0 Comments

问题的出现原因是在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框架来实现。

这个默认行为的原因以及为什么会对整数类型有影响,对我来说仍然是个谜。

0
0 Comments

在使用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中的数字类型。

0