PHP PDO与本机MySQL驱动程序(Mysqlnd) - 获取保留本机列类型的数据


php pdo with native mysql driver ( mysqlnd ) - fetch data retaining native column type

如何从 pdo-mysql 保留 mysql 的本机类型列中获取数据?

示例:我从表中检索一些数据。此表包含作为整数列的 id 列。当从这个表中获取数据时,php 结果数组具有像字符串一样的 id 字段,而不是整数。

array(3) { ["id"]=> string(2) "11" 
           ["name"]=> string(24) "test name"           
           ["surname"]=> string(2) "test suname"
          }

我知道使用 mysqlnd 驱动程序,我可以在 php 中将其作为默认类型获取。

我使用 php 5.3 并且 mysqlnd 已启用:

shell$ php -i | grep -i mysql     
MySQL Support => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $
mysql.allow_local_infile => On => On
mysql.allow_persistent => On => On
mysql.connect_timeout => 60 => 60
mysql.default_host => no value => no value
mysql.default_password => no value => no value
mysql.default_port => 3306 => 3306
mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
mysql.default_user => no value => no value
mysql.max_links => Unlimited => Unlimited
mysql.max_persistent => Unlimited => Unlimited
mysql.trace_mode => Off => Off
mysqli
MysqlI Support => enabled
Client API library version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $
mysqli.allow_local_infile => On => On
mysqli.allow_persistent => On => On
mysqli.default_host => no value => no value
mysqli.default_port => 3306 => 3306
mysqli.default_pw => no value => no value
mysqli.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
mysqli.default_user => no value => no value
mysqli.max_links => Unlimited => Unlimited
mysqli.max_persistent => Unlimited => Unlimited
mysqli.reconnect => Off => Off
mysqlnd
mysqlnd => enabled
Version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $
PDO drivers => mysql, sqlite, sqlite2
pdo_mysql
PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $
pdo_mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock

如何使用本机类型获取数据?

PDO::ATTR_STRINGIFY_FETCHES 参数,理论上它控制着数字(据我所知,没有办法通过任何 MySQL 驱动程序获取带有日期的本机对象):

PDO::ATTR_STRINGIFY_FETCHES:在以下情况下将数值转换为字符串 取。需要布尔值。

您可以使用 PDO::setAttribute() 更改它。但是,驱动程序始终可以自由实现特定的PDO功能,并且MySQL似乎不支持此功能。

话虽如此,一些用户报告说字符串化获取是在模拟参数模式下运行查询的副作用,因此您可以随时禁用它:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

请注意,启用/禁用此类模式会产生其他副作用,包括:

  • 不能多次使用命名参数
  • 获取引用的数字参数(特别是破坏LIMIT子句的参数)