Почему PDO_MySQL не возвращает целое число?

Я переношу свои коды PHP из mysql (устарел в 5.5) на PDO_MySQL . Однако mysql_fetch_row возвращает целое число, в то время как PDOStatement::fetch возвращает строки для чисел. Как я могу заставить PDO вести себя так же, как и предыдущий?

Результат mysql_fetch_row :

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

Результат PDOStatement::fetch :

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

Установите PDO::ATTR_EMULATE_PREPARES на значение false, если вам действительно нужно это с помощью слабо типизированного PHP

Если mysql_fetch_row возвращает значение int для SUM (мне никогда не приходилось проверять) – тогда он делает некоторую магию, как if (ctype_digit($val)) $row[$key] = (int)$val; – так что вы можете сделать в своем DBAL

Насколько я понимаю, как работает подготовленные операторы, он использует ту же структуру пакетов для отправки и получения данных, и этот пакет содержит тип данных.

Похоже, что этот сервер может возвращать данные в 2 форматах – native и mysqlnd, зависит от типа запроса. Последний может быть интерпретирован библиотекой-клиентом для выдачи результирующего значения.

Для записей 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" }