PHP + PDO + MySQL: как вернуть целочисленные и числовые столбцы из MySQL в виде целых чисел и цифр в PHP?

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

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

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

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

  • это невозможно сделать
    • нет, он работает на Mac OS X установлен PHP / MySQL
  • введите cast все ваши значения в коде
    • Нет, я не буду этого делать
  • не беспокойтесь об этом, 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-источник журнала распределение
  • PHP на Ubuntu подключается к облачной базе данных Rackspace
    • версия сервера: 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 = > включен Версия API клиента => 5.1.72

Mac OS X окружающая среда

  • 10.7.5
  • PHP 5.4.16 (cli) (built: Aug 22 2013 09:05:58)
  • php-i

    pdo_mysql

    драйвер PDO для MySQL = > включен Версия API клиента => 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,

помощь и знания будут appreciated :) я определенно буду публиковать здесь, если найду ответ.

1 ответов


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

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

для просмотра php -i, будет нет упоминание о "mysqlnd". The 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. Я обнаружил, что это было доступно с ППА:Ондрей/рнр5-старый стабильный.

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

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

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

теперь php -i будет упоминать" mysqlnd " явно в :

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 is false (проверьте по умолчанию или установите его):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

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

  • типы с плавающей запятой (FLOAT, DOUBLE) возвращаются как поплавки PHP.
  • типы integer (целое число, ИНТ, тип smallint, тип tinyint, MEDIUMINT, тип bigint †) являются возвращается как целые числа PHP.
  • типы с фиксированной точкой (десятичные, числовые) возвращаются в виде строк.

† BIGINTs со значением больше, чем 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)