问题是数据库查询应该在 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_PREPARES
为 false
(检查您的默认值或进行设置):
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
确保 PDO::ATTR_STRINGIFY_FETCHES
为 false
(检查您的默认值或进行设置):
$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/