You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP PDO中fetchAll()配合json_encode为何将所有值转为字符串?

解决PDO查询后json_encode保留数值类型的问题

嘿,这个问题我之前也踩过坑!默认情况下PDO为了兼容不同数据库的差异,会把所有从数据库返回的值都转成字符串——哪怕是INT类型的ID也逃不过。不过有几种实用办法可以解决,看你的需求选就行:

方法一:修改PDO全局配置(推荐全局生效)

在初始化PDO连接的时候,加上两个关键配置,让PDO保留原生的字段类型:

$pdo = new PDO($dsn, $dbUser, $dbPass, [
    PDO::ATTR_STRINGIFY_FETCHES => false, // 禁止把所有查询结果强制转成字符串
    PDO::ATTR_EMULATE_PREPARES => false   // 关闭模拟预处理,让PDO能正确识别数据库原生字段类型
]);

配置完之后,所有用这个PDO连接执行的查询,INT、FLOAT这类数值类型都会保留原本的类型,再用json_encode输出时,ID就会是1而不是"1"了。

方法二:手动转换指定字段(适合个别场景)

如果没法修改PDO的全局配置,或者只想针对这一次查询处理,可以手动遍历结果集,把需要的字段转成对应类型:

$sql = "SELECT * FROM `Type`";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 遍历结果,把ID转成int类型
foreach ($result as &$row) {
    $row['ID'] = (int)$row['ID'];
    // 要是还有其他数值字段(比如价格、数量),也可以在这里一起转换
}
unset($row); // 记得释放引用,避免后续代码出现意外问题

echo json_encode($result);

这种方法灵活性很高,只处理你需要的字段,不会影响其他查询的结果格式。

方法三:用json_encode的参数快速处理(简单但有风险)

还有个偷懒的办法——给json_encode加上JSON_NUMERIC_CHECK选项,它会自动把所有看起来像数字的字符串转成数值类型:

echo json_encode($result, JSON_NUMERIC_CHECK);

不过要注意,这个选项是“一刀切”的:如果你的字符串字段里有纯数字内容(比如用户输入的"123"作为字符串标识),它也会被强制转成数值。所以只有当你确定所有数字格式的字符串都应该是数值类型时,再用这个方法。

总结一下:

  • 想要全局所有查询都保留原生类型?选方法一;
  • 只需要处理个别查询或字段?选方法二;
  • 想快速解决且没有字符串数字冲突的场景?选方法三。

内容的提问来源于stack exchange,提问作者JamMan9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:08:43