Por que o PDO_MySQL não retorna inteiro?

Estou migrando meus códigos PHP do mysql (obsoleto em 5.5) para PDO_MySQL . No entanto, mysql_fetch_row retorna inteiro enquanto PDOStatement::fetch retorna strings para números. Como posso fazer a DOP se comportar como a anterior?

Resultado de mysql_fetch_row :

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

Resultado de PDOStatement::fetch :

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

Defina PDO::ATTR_EMULATE_PREPARES para falso, se você realmente precisar dele com o PHP fracamente

Se mysql_fetch_row retornar você int para SUM (eu nunca me importo para verificar) – então faz alguma magia como if (ctype_digit($val)) $row[$key] = (int)$val; – para que você possa fazer em seu DBAL

Tanto quanto eu entendo, o modo como as instruções preparadas funcionam, ele usa a mesma estrutura de pacotes para enviar e recuperar dados e este pacote contém tipo de dados.

Parece que o servidor pode retornar dados em 2 formatos – nativo e mysqlnd, depende do tipo de solicitação. Um último pode ser interpretado pela biblioteca do cliente para transmitir o valor resultante.

Para os registros, o PDO fornece um recurso que alteraria isso, PDO::ATTR_STRINGIFY_FETCHES :

Converta valores numéricos em strings ao buscar. Requer bool .

O raciocínio por trás da configuração é que os mecanismos de database podem lidar com números muito grandes (Oracle, por exemplo, permite números de 38 dígitos) e o PHP não pode. Recuperar esses números como strings é um método para manter a segurança e evitar a perda de dados.

Infelizmente, o driver MySQL não o suporta :

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