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

为何Laravel生产环境返回的数字和布尔值会被转为字符串类型?

问题产生原因
  • 核心为数据库PDO配置差异:生产环境PDO连接开启了ATTR_STRINGIFY_FETCHES 参数,该参数启用后会强制将数据库查询返回的所有数值、布尔类型结果自动转为字符串
  • MySQL驱动版本差异:本地环境使用mysqlnd 作为PHP MySQL驱动,生产环境使用旧版libmysqlclient 驱动,后者默认将所有数据库返回的数值类型转为字符串,不受PDO参数控制
  • Laravel模型未配置类型转换:接口返回数据直接来自模型查询结果,未配置$casts 属性做强制类型转换,会直接继承PDO返回的字段类型
解决方案
  • 修改Laravel数据库配置:打开config/database.php,找到mysql连接的options 配置项,添加如下参数强制关闭字符串化逻辑:
'options' => extension_loaded('pdo_mysql') ? array_filter([
    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    // 新增以下两行配置
    PDO::ATTR_STRINGIFY_FETCHES => false,
    PDO::ATTR_EMULATE_PREPARES => false,
]) : [],

如果原有配置已经存在options数组,直接添加两行PDO参数即可,不要覆盖已有配置

  • 替换生产环境MySQL驱动:执行php -i | grep mysqlnd 检查当前驱动,无输出的话卸载原有php-mysql包,安装php-mysqlnd包即可,CentOS环境执行命令:
    yum remove php-mysql && yum install php-mysqlnd
  • 配置模型强制类型转换:在对应数据模型中添加$casts 属性,明确指定字段的返回类型,不受数据库环境配置影响:
protected $casts = [
    'age' => 'integer',
    'is_admin' => 'boolean',
];

该方案兼容性最强,优先推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:45:03