A solução é garantir que você esteja usando o mysqlnd driver para php.
Como você sabe que não está usando mysqlnd?
Ao visualizar
php -i
, não haverá não menção de "mysqlnd". O pdo_mysql
seção terá algo assim:pdo_mysql
PDO Driver for MySQL => enabled Client API version => 5.1.72
Como você o instala?
A maioria dos guias de instalação para L/A/M/P sugere
apt-get install php5-mysql
mas o driver nativo para MySQL é instalado por um pacote diferente:php5-mysqlnd
. Descobri que isso estava disponível com o ppa:ondrej/php5-oldstable . Para mudar para o novo driver (no Ubuntu):
- Remova o driver antigo:
apt-get remove php5-mysql
- Instale o novo driver:
apt-get install php5-mysqlnd
- Reiniciar o apache2:
service apache2 restart
Como verifico se o driver está sendo usado?
Agora
php -i
irá mencionar "mysqlnd" explicitamente no pdo_mysql
seção:pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
Configurações do PDO
Certifique-se de que
PDO::ATTR_EMULATE_PREPARES
é false
(verifique seus padrões ou defina-os):$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Certifique-se de que
PDO::ATTR_STRINGIFY_FETCHES
é false
(verifique seus padrões ou defina-os):$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
Valores retornados
- Tipos de ponto flutuante (FLOAT, DOUBLE) são retornados como floats PHP.
- Tipos inteiros (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT †) são retornados como inteiros PHP.
- Tipos de ponto fixo (DECIMAL, NUMERIC) são retornados como strings.
† BIGINTs com um valor maior que um int assinado de 64 bits (9223372036854775807) retornarão como uma string (ou 32 bits em um sistema de 32 bits)
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)