PHP + PDO + MySQL: как я могу возвращать целочисленные и числовые столбцы из MySQL как целые числа и числа в PHP?

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

Проблема в том, что запрос БД должен возвращать целочисленные типы данных в PHP для целых столбцов. Вместо этого запрос возвращает каждый столбец как строковый тип.

Я гарантировал, что «PDO :: ATTR_STRINGIFY_FETCHES», если false, просто для того, чтобы убедиться, что результаты не передаются в строку.

Ответы, которые я видел:

  • Это невозможно сделать
    • Нет, он работает на Mac OS X, установленном PHP / MySQL
  • Введите все ваши значения в свой код.
    • Нет, я не буду этого делать
  • Не беспокойтесь об этом, PHP свободно набирается
    • Мои данные выводятся как JSON и потребляются многими другими службами, некоторые требуют данных в правильном формате

Из моих исследований я понимаю, что это проблема внедрения драйверов.

Многие источники утверждают, что родной драйвер MySQL не поддерживает возвращаемые числовые типы. Это не похоже на то, поскольку он работает на Mac OS X. Если они не хотят сказать, что «родной драйвер MySQL в Linux не поддерживает эту функцию».

Это означает, что есть что-то особенное в драйвере / среде, которую я установил в Mac OS X. Я пытался выявить различия, чтобы применить исправление, но я ограничен моим знанием того, как проверить эти вещи.

Различия:

  • PHP на OS X был скомпилирован и установлен через Home Brew
  • PHP на Ubuntu был установлен через «apt-get install php5-dev»,
  • PHP на OS X подключается к серверу MySQL, также работающему на OS X
    • Версия сервера: 5.1.71-log Распределение источников
  • PHP на Ubuntu подключается к базе данных Rackspace Cloud
    • Версия сервера: 5.1.66-0 + squeeze1 (Debian)

Среда Ubuntu

  • Версия: 10.04.1
  • PHP 5.4.21-1 + debphp.org ~ lucid + 1 (cli) (построено: 21 октября 2013 08:14:37)
  • php -i

    PDO_MySQL

    Драйвер PDO для MySQL => включен Client API version => 5.1.72

Среда Mac OS X

  • 10.7.5
  • PHP 5.4.16 (cli) (построено: 22 августа 2013 г. 09:05:58)
  • php -i

    PDO_MySQL

    PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.10 – 20111026 – $ Id: e707c415db32080b3752b232487a435ee0372157 $

Используются флаги PDO

PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => false, 

Любая помощь и опыт будут оценены 🙂 Я обязательно отправлюсь сюда, если найду ответ.

Solutions Collecting From Web of "PHP + PDO + MySQL: как я могу возвращать целочисленные и числовые столбцы из MySQL как целые числа и числа в PHP?"

Решение состоит в том, чтобы убедиться, что вы используете драйвер mysqlnd для php.

Откуда вы знаете, что вы не используете mysqlnd?

При просмотре php -i не будет упоминания о «mysqlnd». В разделе pdo_mysql будет что-то вроде этого:

 pdo_mysql PDO Driver for MySQL => enabled Client API version => 5.1.72 

Как его установить?

В большинстве руководств по установке для L / A / M / P предлагается apt-get install php5-mysql но собственный драйвер для MySQL устанавливается другим пакетом: php5-mysqlnd . Я обнаружил, что это доступно с помощью ppa: ondrej / php5-oldstable .

Чтобы переключиться на новый драйвер (на Ubuntu):

  • Удалите старый драйвер:
    apt-get remove php5-mysql
  • Установите новый драйвер:
    apt-get install php5-mysqlnd
  • Перезапустить apache2:
    service apache2 restart

Как проверить, что драйвер используется?

Теперь php -i будет явно указывать «mysqlnd» в разделе pdo_mysql :

 pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $ 

Настройки PDO

Убедитесь, что PDO::ATTR_EMULATE_PREPARES является false (проверьте настройки по умолчанию или установите его):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Убедитесь, что PDO::ATTR_STRINGIFY_FETCHES является false (проверьте настройки по умолчанию или установите его):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

Возвращаемые значения

  • Типы плавающей запятой (FLOAT, DOUBLE) возвращаются, когда PHP плавает.
  • Целочисленные типы (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT †) возвращаются как целые числа PHP.
  • Типы фиксированной точки (DECIMAL, NUMERIC) возвращаются в виде строк.

† BIGINT со значением, превышающим 64-битный подписанный int (9223372036854775807), будет возвращаться в виде строки (или 32 бита в 32-битной системе)

  object(stdClass)[915] public 'integer_col' => int 1 public 'double_col' => float 1.55 public 'float_col' => float 1.5 public 'decimal_col' => string '1.20' (length=4) public 'bigint_col' => string '18446744073709551615' (length=20)