为什么PDO_MySQL不返回整数?

Hao*_*eng 15 php mysql pdo

我正在将我的PHP代码从mysql(在5.5中弃用)迁移到PDO_MySQL.但是,mysql_fetch_row返回整数,同时PDOStatement::fetch返回数字的字符串.如何让PDO像前者一样?

结果mysql_fetch_row:

array(1) {
  ["id"]=>
  int(1)
}
Run Code Online (Sandbox Code Playgroud)

结果PDOStatement::fetch:

array(1) {
  ["id"]=>
  string(1) "1"
}
Run Code Online (Sandbox Code Playgroud)

You*_*nse 13

设置PDO::ATTR_EMULATE_PREPARES为false,如果你真的需要松散类型的PHP

如果mysql_fetch_row返回你为SUM的int(我从不关心检查) - 那么它会做一些神奇的if (ctype_digit($val)) $row[$key] = (int)$val;- 所以你可以在你的DBAL中做

据我所知,预处理语句的工作方式,它使用相同的数据包结构来发送和检索数据,这个数据包包含数据类型.

看起来服务器可以返回2种格式的数据 - native和mysqlnd,取决于请求类型.后者可以由客户端库解释以转换结果值.


Álv*_*lez 11

对于记录,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);
}
Run Code Online (Sandbox Code Playgroud)

 

array(2) {
  ["integer_number"]=>
  string(1) "1"
  ["floating_point"]=>
  string(4) "3.14"
}
Run Code Online (Sandbox Code Playgroud)


Hor*_*lon 5

您可以使用 json_encode 和 json_decode 以及 JSON_NUMERIC_CHECK 选项来检索具有数字类型的数组:

$my_array = json_decode(json_encode( $my_array, JSON_NUMERIC_CHECK ));
Run Code Online (Sandbox Code Playgroud)