一尘不染

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

mysql

我已经在Stack Overflow上重复了几次这个问题,但是没有一个人充分探讨这个问题(或者至少以一种对我有帮助的方式)

问题在于,数据库查询应在PHP中为整数列返回整数数据类型。而是查询将每一列作为字符串类型返回。

我已经确保“ PDO :: ATTR_STRINGIFY_FETCHES”为 false 只是为了确保结果不会被强制转换为字符串。

我见过的答案:

  • 做不到
    • 不,它可以在安装了PHP / MySQL的Mac OS X上运行
  • 在代码中输入类型转换
    • 不,我不会那样做
  • 不用担心,PHP是松散类型的
    • 我的数据以JSON格式输出,并由许多其他服务使用,其中一些服务要求数据格式正确

根据我的研究,我知道这是驱动程序实施的问题。

许多消息来源声称MySQL本机驱动程序不支持返回数字类型。由于它可以在Mac OS X上运行,因此似乎并非如此。除非他们的意思是说“ Linux
上的MySQL本机驱动程序不支持该功能”。

这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处。我一直在尝试找出差异以便应用修复程序,但我对如何检查这些问题的知识感到受限制。

区别:

  • OS X上的PHP是通过Home Brew编译并安装的
  • 通过“ apt-get install php5-dev”在Ubuntu上安装PHP
  • OS X上的PHP正在连接到也在OS X上运行的MySQL服务器
    • 服务器版本:5.1.71-log源分发
  • 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-我

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-我

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,

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


阅读 268

收藏
2020-05-17

共1个答案

一尘不染

解决方案是确保您使用的是php 的 mysqlnd 驱动程序。

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

查看时php -i不会 提及“ mysqlnd”。该pdo_mysql部分将具有以下内容:

pdo_mysql

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

如何安装?

大多数L / A / M / P的安装指南都建议使用,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);

返回值

  • 浮点类型(FLOAT,DOUBLE)作为PHP浮点数返回。
  • 整数类型(INTEGER,INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT†)以PHP整数形式返回。
  • 定点类型(DECIMAL,NUMERIC)作为字符串返回。

†值大于64位有符号整数(9223372036854775807)的BIGINT将作为字符串返回(或在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)
2020-05-17