php - 如何从 MySQL 返回整数和数字列作为 PHP 中的整数和数字?

标签 php mysql pdo

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

我已确保 "PDO::ATTR_STRINGIFY_FETCHES"if false 只是为了确保结果不会被转换为字符串。

我看到的答案:

  • 无法做到
    • 不,它可以在安装了 PHP/MySQL 的 Mac OS X 上运行
  • 在代码中输入所有值
    • 不,我不会这样做
  • 别担心,PHP 是松散类型的
    • 我的数据以 JSON 格式输出并被许多其他服务使用,有些需要正确格式的数据

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

许多消息来源声称 MySQL native 驱动程序不支持返回数字类型。这似乎不正确,因为它适用于 Mac OS X。除非他们的意思是说“Linux 上的 MySQL native 驱动程序不支持该功能”。

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

区别:

  • OS X 上的 PHP 是通过 Home Brew 编译和安装的
  • Ubuntu 上的 PHP 是通过“apt-get install php5-dev”安装的
  • 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 -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,

最佳答案

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

你怎么知道你没有使用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 的 native 驱动程序由不同的软件包安装:php5-mysqlnd。我发现这可以通过 ppa:ondrej/php5-oldstable 获得。

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

  • 删除旧驱动:
    apt-get remove php5-mysql
  • 安装新驱动:
    apt-get install php5-mysqlnd
  • 重启apache2:
    服务 apache2 重启

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

现在 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 float 返回。
  • 整数类型(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)

关于php - 如何从 MySQL 返回整数和数字列作为 PHP 中的整数和数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079320/

相关文章:

MySql 插入并选择全合一

php - 使用 php 和 mysql 查看所有表

php - 为什么这个 PDO 语句会默默地失败?

php - 在 MySQL 中使用什么函数来散列密码?

c# - 在 Windows 上将 Sphinx 与 MVC 和 MYSQL 结合使用

Php JSONArray解码并执行数据库操作

php - 多个 PDO 插入单语句不起作用

php - PHP PDO SQLite连接

php - Explode on new line 适用于 "\n"但不适用于 PHP_EOL。为什么?

php - 从 PayPal 链接发票