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-источник журнала распределение
  • PHP на Ubuntu подключается к облачной базе данных Rackspace
    • версия сервера: 5.1.66-0+squeeze1 (Debian)

системы

  • версия: 10.04.1
  • PHP 5.4.21-1+debphp.org~lucid+1 (cli) (встроенный: Oct 21 2013 08:14:37)
  • php-i

    pdo_mysql

    PDO драйвер для MySQL = > включен Версия API клиента => 5.1.72

Mac OS X environment

  • 10.7.5
  • PHP 5.4.16 (cli) (встроенный: 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,

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

1 67

1 ответ:

решение состоит в том, чтобы убедиться, что вы используете 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 устанавливается a другой пакет: 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 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.
  • типы с фиксированной точкой (десятичные, числовые) возвращаются в виде строк.

† 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)