The solution is to ensure that you are using the mysqlnd driver for php.
How do you know that you're not using mysqlnd?
When viewing php -i
, there will be no mention of "mysqlnd". The pdo_mysql
section will have something like this:
pdo_mysql
PDO Driver for MySQL => enabled Client API version => 5.1.72
How do you install it?
Most installation guides for L/A/M/P suggest apt-get install php5-mysql
but the native driver for MySQL is installed by a different package: php5-mysqlnd
. I found that this was available with the ppa:ondrej/php5-oldstable.
To switch to the new driver (on Ubuntu):
- Remove the old driver:
apt-get remove php5-mysql
- Install the new driver:
apt-get install php5-mysqlnd
- Restart apache2:
service apache2 restart
How do I check that the driver is being used?
Now php -i
will mention "mysqlnd" explicitly in the pdo_mysql
section:
pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
PDO settings
Ensure that PDO::ATTR_EMULATE_PREPARES
is false
(check your defaults or set it):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Ensure that PDO::ATTR_STRINGIFY_FETCHES
is false
(check your defaults or set it):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
Returned values
- Floating-point types (FLOAT, DOUBLE) are returned as PHP floats.
- Integer types (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ?) are returned as PHP integers.
- Fixed-Point types (DECIMAL, NUMERIC) are returned as strings.
? BIGINTs with a value greater than a 64 bit signed int (9223372036854775807) will return as a string (or 32 bits on a 32 bit system)
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)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…