PHP + PDO + MySQL:如何从MySQL中返回整数和数字列作为整数和数字在PHP中?

我已经看到这个问题在Stack Overflow上重复了几次,但是没有一个能够充分地探究这个问题(或者至less对我有帮助)

问题是数据库查询应该返回整型数据types的整数列在PHP中。 而是查询以stringtypes的forms返回每一列。

我已经确保“PDO :: ATTR_STRINGIFY_FETCHES”如果只是为了确保结果不被转换为string。

我见过的答案:

  • 这是不能做到的
    • 不,它正在Mac OS X上安装PHP / MySQL
  • 在你的代码中input所有的值
    • 不,我不会这样做的
  • 不要担心,PHP是松散的types
    • 我的数据以JSONforms输出,并被许多其他服务使用,有些则需要格式正确的数据

从我的研究中,我了解到这是一个驱动程序的实现问题。

许多消息来源声称,MySQL本地驱动程序不支持返回的数字types。 这似乎不正确,因为它在Mac OS X上工作。除非他们的意思是说“ Linux上的MySQL本地驱动程序不支持该function”。

这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处。我一直试图找出差异来应用修复程序,但是由于我对如何检查这些东西的知识而受到限制。

区别:

  • OS X上的PHP是通过Home Brew编译和安装的
  • Ubuntu上的PHP通过“apt-get install php5-dev”安装
  • OS X上的PHP连接到也在OS X上运行的MySQL服务器
    • 服务器版本:5.1.71-日志源分配
  • Ubuntu上的PHP连接到Rackspace云数据库
    • 服务器版本:5.1.66-0 + squeeze1(Debian)

Ubuntu环境

  • 版本:10.04.1
  • PHP 5.4.21-1 + debphp.org〜lucid + 1(cli)(内置:2013年10月21日08:14:37)
  • php -i

    PDO_MYSQL

    用于MySQL的PDO驱动程序=>启用的客户端API版本=> 5.1.72

Mac OS X环境

  • 10.7.5
  • PHP 5.4.16(cli)(内置:2013年8月22日上午09时05分58秒)
  • php -i

    PDO_MYSQL

    用于MySQL的PDO驱动程序=>启用客户端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, 

任何帮助和专业知识将不胜感激:)如果我find答案,我一定会在这里发布。

解决的办法是确保你使用的是mysql的mysqlnd驱动程序。

你怎么知道你没有使用mysqlnd?

当查看php -i ,将不会提及“mysqlnd”。 pdo_mysql部分将有这样的东西:

 pdo_mysql PDO Driver for MySQL => enabled Client API version => 5.1.72 

你如何安装它?

L / A / M / P的大多数安装指南都build议apt-get install php5-mysql但是MySQL的本地驱动程序是由不同的包安装的: php5-mysqlnd 。 我发现这是可用的ppa:ondrej / php5-oldstable

切换到新的驱动程序(在Ubuntu上):

  • 删除旧的驱动程序:
    apt-get remove php5-mysql
  • 安装新的驱动程序:
    apt-get install php5-mysqlnd
  • 重新启动apache2:
    service apache2 restart

如何检查驱动程序是否正在使用?

现在, php -i将在pdo_mysql部分明确提到“mysqlnd”:

 pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $ 

PDO设置

确保PDO::ATTR_EMULATE_PREPARESfalse (检查你的默认值或设置它):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

确保PDO::ATTR_STRINGIFY_FETCHESfalse (检查您的默认设置或设置它):
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

返回值

  • 浮点types(FLOAT,DOUBLE)以PHP浮点forms返回。
  • 整数types(INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT†)作为PHP整数返回。
  • 定点types(DECIMAL,NUMERIC)作为string返回。

†大于64位有符号整数(9223372036854775807)的BIGINT将以stringforms返回(或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)