问题在于,DB查询应该在PHP中为整数列返回整数数据类型.相反,查询以字符串类型返回每一列.

我已经确保"PDO::ATTR_STRINGIFY_FETCHES"如果为false,只是为了确保结果不会被转换为字符串.

我看到的答案是:

  • 这是做不到的
    • 不能,它可以在安装了PHP/MySQL的Mac OS X上运行
  • 在代码中键入强制转换所有值
    • 不,我不会那么做的
  • 别担心,PHP是松散类型的

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

许多来源声称MySQL本机驱动程序不支持返回数值类型.这似乎不是真的,因为它可以在MacOSX上运行,除非他们的意思是说"Linux上的MySQL本机驱动程序不支持该功能".

这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处.我一直在try 找出差异,以便应用修复程序,但我对如何判断这些方面的知识有限.

不同之处在于:

  • 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+Squze1(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)(Build:Aug 22 2013 09:05:58)

  • php-i

    pdo_mysql

    MySQL的PDO驱动程序=>启用

使用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,

推荐答案

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

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

当观看php -i时,会有no次提到"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上),请执行以下操作:

  • Remove the old driver:
    apt-get remove php5-mysql
  • Install the new driver:
    apt-get install php5-mysqlnd
  • Restart 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设置

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);

返回值

  • 浮点类型(FLOAT、DOUBLE)作为PHP浮点返回.
  • 整数类型(INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINTPHP)作为†整数返回.
  • 定点类型(十进制、数字)以字符串形式返回.

†值大于64位带符号整数(9223372036854775807)的大整数将作为字符串返回(或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相关问答推荐

如何在WordPress中为特定自定义帖子类型自定义URL struct

无法使用DOMPDF在PDF中呈现非ANSI字符

向在添加到购物车上动态创建的WooCommerce产品添加发货类别

WooCommerce常规价格增加额外的附加平价

根据WooCommerce购物车页面中的自定义 Select 添加费用

PHP SimpleXML:按属性值访问 node

在WooCommerce上设置简单和可变产品的最小订单量

防止 WooCommerce 在前端加载全尺寸图像

PHP Laravel 迁移文件不创建关系

Google Drive API:为什么使用服务帐户在下载文件时会将我带到 Google Drive 登录窗口?

在 WooCommerce 管理变量产品中启用其他变体图像

CodeIgniter 4中嵌套过滤器组不起作用

在WooCommerce中显示 checkout 的高级自定义字段(Advanced Custom Fields)并保存其值

用于检测此模式的正则表达式:something;something=something,something=something... 未知次数

为 WordPress 页面创建新功能

Shopware 6:无法在新的自定义插件中保存关联字段(媒体)

同时执行odbc_execute、odbc_fetch_row和odbc_result

如何将数字文本文件添加到 PHP 数学方程式中?

PHP Loop 在迭代中使用修改后的数据

列表不在 GROUP BY 子句中并且包含 X2CRM 中的非聚合列