Laravel 8存入Decimal类型数据小数点变为逗号如何解决
问题原因排查及解决方案
你的Laravel迁移文件定义本身没有错误,decimal(11,7)的精度完全可以支撑你输入的经纬度数值,小数点被替换为逗号的问题和字段类型定义无关,通常来自以下几个场景:
- 数据库侧区域配置错误
绝大多数关系型数据库(如MySQL、PostgreSQL)的数值格式化逻辑会继承系统或数据库自身的区域设置,如果lc_numeric参数配置的是使用逗号作为小数分隔符的区域(如欧洲、东南亚部分地区的本地化配置),就会自动将存储的数值小数点替换为逗号。
你可以执行对应的SQL查看配置:SHOW VARIABLES LIKE 'lc_numeric';
如果返回值不是en_US.UTF-8这类使用点作为小数分隔符的区域配置,即可定位为该问题。 - Laravel应用侧区域配置错误
检查config/app.php文件中的locale、faker_locale参数,如果配置的是使用逗号作为小数分隔符的语言区域,在数据写入前的格式化环节可能会自动转换小数点符号。 - 写入前的数值格式化逻辑错误
如果你在数据写入数据库前调用了number_format()等本地化格式化函数,且没有手动指定第三个参数(小数分隔符),函数会自动使用当前系统默认的小数分隔符,将点替换为逗号。 - 数据库驱动配置问题
部分PDO驱动会自动继承操作系统的区域设置处理数值,你可以在config/database.php对应的数据库连接配置中添加初始化指令,强制指定数值格式化规则,MySQL示例如下:
'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_INIT_COMMAND => "SET lc_numeric='en_US.UTF-8'", ]) : [],
你可以先直接执行原生SQL插入测试数据,如果原生插入依然出现逗号替换问题,即可确定是数据库侧配置问题,否则排查应用侧的代码逻辑即可。
内容的提问来源于stack exchange,提问作者Sutan Firqy
相关产品推荐
相关产品推荐

