为什么不PDO_MySQL返回整数?

2022-08-30 22:05:49

我正在将 PHP 代码从(在 5.5 中已弃用)迁移到 。但是,返回整数,同时返回数字字符串。如何使 PDO 的行为与前者类似?mysqlPDO_MySQLmysql_fetch_rowPDOStatement::fetch

结果:mysql_fetch_row

array(1) {
  ["id"]=>
  int(1)
}

结果:PDOStatement::fetch

array(1) {
  ["id"]=>
  string(1) "1"
}

答案 1

设置为 false,如果你真的需要它和松散类型的 PHPPDO::ATTR_EMULATE_PREPARES

如果返回你的INT为SUM(我从来没有关心检查) - 那么它做了一些魔术像 - 所以你可以在你的DBAL中做mysql_fetch_rowif (ctype_digit($val)) $row[$key] = (int)$val;

据我所知,预准备语句的工作方式,它使用相同的数据包结构来发送和检索数据,并且此数据包包含数据类型。

看起来服务器可以返回2种格式的数据 - 本机和mysqlnd,具体取决于请求类型。客户端库可以解释后一个以强制转换结果值。


答案 2

对于记录,PDO提供了一个可以改变这一点的功能, :PDO::ATTR_STRINGIFY_FETCHES

提取时将数值转换为字符串。需要。bool

该设置背后的基本原理是数据库引擎可以处理非常大的数字(例如,Oracle允许38位数字),而PHP则不能。将这些数字检索为字符串是一种保持安全和防止数据丢失的方法。

不幸的是,MySQL驱动程序不支持它

<?php

$pdo = new PDO('mysql:host=localhost;dbname=test', 'test', 'test');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$sql = 'SELECT 1 AS integer_number, 3.14 AS floating_point';
$res = $pdo->query($sql);
while($row = $res->fetch(PDO::FETCH_ASSOC)){
    var_dump($row);
}

 

array(2) {
  ["integer_number"]=>
  string(1) "1"
  ["floating_point"]=>
  string(4) "3.14"
}

推荐