I've seen this question repeated a few times on Stack Overflow but none sufficiently explore the problem (or at least in a way that is helpful to me)
The problem is that a DB query should return integer data types in PHP for integer columns. Instead the query returns every column as a string type.
I've ensured that "PDO::ATTR_STRINGIFY_FETCHES" if false just to make sure results aren't being cast to string.
Answers that I've seen:
- It can't be done
- Nope, it's working on Mac OS X installed PHP/MySQL
- Type cast all your values in your code
- Nope, I won't be doing that
- Don't worry about it, PHP is loosely typed
- My data is output as JSON and is consumed by many other services, some require the data in the correct format
Из моих исследований я понимаю, что это проблема с реализацией драйвера.
Многие источники утверждают, что собственный драйвер 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 => включена версия клиентского API => 5.1.72
Среда Mac OS X
- 10.7.5
- PHP 5.4.16 (cli) (построено: 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,
Любая помощь и опыт будут оценены :) Я обязательно отправлю сюда ответ, если найду ответ.