Как получить числовые типы из MySQL с помощью PDO?

Я использую PDO и MySQL, по какой-то причине, получая значения из базы данных, которые являются типами int, PDOStatement возвращает строковое представление числа, а не значение числового типа. Как я могу предотвратить это?

Я заметил, что есть атрибут класса PDO: PDO::ATTR_STRINGIFY_FETCHES который должен позаботиться об этом, но при попытке изменить его он выдает сообщение об ошибке, PDO::ATTR_STRINGIFY_FETCHES что атрибут недействителен для драйвера MySQL.

Нормально ли получать строки вместо цифр при консультации с базой данных?

Solutions Collecting From Web of "Как получить числовые типы из MySQL с помощью PDO?"

Я не думаю, что «числа» можно сделать в PHP 5.2 🙁

В PHP 5.3 становится возможным, если я правильно помню, когда вы используете новый (новый как в PHP> = 5.3) драйвер mysql nd (MySQL Native Driver) .

Ну, после того, как я больше поработал PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3 своими закладками, я нашел эту статью о mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

В нем говорится (цитата):

Преимущества использования mysqlnd для PDO

mysqlnd возвращает собственные типы данных при использовании Подготовленных утверждений на стороне сервера, например, столбец INT возвращается как целочисленная переменная, а не как строка. Это означает меньшее количество преобразований данных внутри.

Но это только PHP 5.3 (при условии, что ваша версия PHP 5.3 скомпилирована с помощью mysqlnd ( а не старого libmysql) ) и, похоже, имеет место только для подготовленных операторов 🙁

Сожалею…

Решение будет иметь на PHP-стороне систему отображения (например, ORM – см. Доктрину , как пример ORM: я не знаю, выполняет ли она то, что вы просите) для преобразования результатов начиная с базы данных DB до PHP …

И да, это плохо, если вы хотите использовать такие операторы, как === и !== , которые чувствительны к типу …

Прежде всего, чтобы ответить на ваш последний вопрос: «да», к сожалению, нормально принимать цифры как строки. Как говорится в руководстве, приведенном Паскалем, mysqlnd (PHP 5.3) вернет собственные типы данных из подготовленных операторов, если вы отключите подготовленную эмуляцию оператора из PDO.

 new PDO($dsn, $user, $pass, array( PDO::ATTR_EMULATE_PREPARES => false )) 

PDO :: ATTR_STRINGIFY_FETCHES не имеет отношения к MySQL.

Если вы посмотрите на яркую сторону, это хорошая практика, чтобы использовать подготовленные заявления в любом случае, поэтому …;)

Ответ Паскаля правильный. У меня были проблемы с тем, что все это работало. Вот что вам нужно сделать.

Во-первых, убедитесь, что у вас установлен и активирован mysqlnd. Посмотрите на php --info . В разделе pdo_mysql он должен выглядеть так:

 pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321 

Если вместо просмотра mysqlnd в версии Client API вы увидите строку, такую ​​как …

 Client API version => 5.5.29 

… тогда у вас нет mysqlnd, установленного и идущего. Позаботьтесь об этом в первую очередь.

Во-вторых, PDO использует эмулированные подготовленные заявления по умолчанию для всех подключений MySQL . Смешно, но вот оно. И вы получите собственные типы данных только в том случае, если вы используете реальные подготовленные операторы (называемые «подготовленные на стороне сервера заявления» в связанном блоге, который теперь находится здесь ). Поэтому вы должны установить для PDO :: ATTR_EMULATE_PREPARES значение false, например:

 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

Наконец, убедитесь, что вы не установили для PDO :: ATTR_STRINGIFY_FETCHES значение true.

 $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 

У вас может быть установлен mysqlnd , но это не значит, что он готов к использованию обычным расширением PDO (pdo_mysql) , это чаще встречается на общем хостинге, поэтому обязательно включите расширение nd_pdo_mysql , а также отключите другие extension pdo_mysql поскольку это может создать конфликт.

@Скриншот

введите описание изображения здесь

Я нашел этот (дублированный) вопрос , решил разместить здесь свои мысли, надеюсь, что он прекрасен;)