¿Por qué no PDO_MySQL devuelve entero?

Estoy migrando mis códigos PHP de mysql (obsoleto en 5.5) a PDO_MySQL . Sin embargo, mysql_fetch_row devuelve un entero mientras que PDOStatement::fetch devuelve cadenas para los números. ¿Cómo puedo hacer que la DOP se comporte como la anterior?

Resultado de mysql_fetch_row :

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

Resultado de PDOStatement::fetch :

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

Establezca PDO::ATTR_EMULATE_PREPARES en falso, si realmente lo necesita con PHP de tipo débil.

Si mysql_fetch_row devuelve int para SUM (a mí nunca me importó verificarlo), entonces hace algo mágico como if (ctype_digit($val)) $row[$key] = (int)$val; – Para que puedas hacer en tu DBAL.

Según tengo entendido, la forma en que funcionan las declaraciones preparadas, utiliza la misma estructura de paquetes para enviar y recuperar datos, y este paquete contiene el tipo de datos.

Parece que ese servidor puede devolver datos en 2 formatos: nativo y mysqlnd, depende del tipo de solicitud. Una última puede ser interpretada por la biblioteca cliente para emitir el valor resultante.

Para los registros, la DOP proporciona una característica que podría alterar esto, PDO::ATTR_STRINGIFY_FETCHES :

Convierte valores numéricos a cadenas al buscar. Requiere bool .

La razón detrás de la configuración es que los motores de base de datos pueden manejar números muy grandes (Oracle, por ejemplo, permite números de 38 dígitos) y PHP no. Recuperar esos números como cadenas es un método para mantenerse seguro y evitar la pérdida de datos.

Desafortunadamente, el controlador MySQL no lo admite :

 < ?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" } 

Puede usar json_encode y json_decode con la opción JSON_NUMERIC_CHECK para recuperar su matriz con tipos numéricos:

 $my_array = json_decode(json_encode( $my_array, JSON_NUMERIC_CHECK ));