Laravel如何做数据库迁移字段精度设置_Laraveldecimal位数控制【方法】

陌丽小哥_4769

陌丽小哥_4769

2026-03-23

648人浏览

原创

decimal字段的precision是总位数、scale是小数位数,须满足scale≤precision;填反或超限会导致截断或报错,金额等精确场景必须用decimal而非float。

laravel如何做数据库迁移字段精度设置_laraveldecimal位数控制【方法】

decimal 字段的 precision 和 scale 怎么填才不丢精度

填反了就存不进小数,或者直接被截断成整数——decimal(8,2) 不是“总共 8 位,小数占 2 位”,而是“总共最多 8 位数字,其中小数点后固定占 2 位”。precision 是总位数(含小数点前+后),scale 是小数点后位数。

常见错误现象:DB::table('orders')->insert(['amount' => 123.456]) 存进去变成 123.45,甚至报错 Out of range value for column 'amount'。

  • decimal(10,2):最大能存 99999999.99(8 位整数 + 小数点 + 2 位小数)
  • decimal(5,3):最大只能存 99.999(2 位整数 + 3 位小数),不是“任意 5 位数字”
  • Laravel 迁移里用 $table->decimal('price', 10, 2),顺序不能颠倒;写成 decimal('price', 2, 10) 会创建出 decimal(2,10),MySQL 直接拒绝(scale 不能大于 precision)

迁移中改 decimal 字段精度会丢失数据吗

会。MySQL 在 ALTER TABLE ... MODIFY COLUMN 时,如果新定义的 precision 或 scale 缩小了,已有数据可能被截断或四舍五入,且 Laravel 默认不提示。

使用场景:上线后发现价格字段要支持分以下单位(如厘),需要从 decimal(10,2) 升级到 decimal(12,4)。

  • 安全做法:先加新字段(如 price_new),用 PHP 迁移旧值(round($old * 100) / 10000),再删旧字段、重命名
  • 直接改:用 $table->decimal('price', 12, 4)->change(),但必须确认当前所有值都能无损映射——比如原值 123.45 改成 decimal(12,4) 没问题,但若原字段是 decimal(5,2) 存过 1234.56,改完就会报错
  • 执行前务必在测试库跑 SELECT MAX(LENGTH(SUBSTRING_INDEX(price, '.', 1))) AS int_len, MAX(LENGTH(SUBSTRING_INDEX(price, '.', -1))) AS dec_len FROM orders; 算出实际整数/小数长度

float/double 和 decimal 在 Laravel 迁移里怎么选

除非你存的是科学计算中间值,否则别用 float 或 double——它们是二进制浮点,0.1 + 0.2 !== 0.3,Laravel 的 Eloquent 取出来可能变成 0.30000000000000004。

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载

使用场景:金额、重量、税率等要求精确十进制运算的字段。

  • $table->decimal('fee', 10, 2) → 安全,Eloquent 返回原样字符串或 float(取决于 casts),但数据库层面无误差
  • $table->float('score') → 适合评分、相似度等允许微小误差的场景
  • 注意:MySQL 的 decimal 在查询时不会自动转成 PHP float,但如果你在模型里写了 protected $casts = ['price' => 'float'],PHP 浮点精度问题就又回来了

decimal 字段在 Seeder 或工厂里怎么避免精度丢失

PHP 的 rand() 或 mt_rand() 生成整数再除,容易引入浮点误差;number_format() 返回字符串,但 Eloquent 插入时若没设 casts,可能被当成字符串处理导致 MySQL 警告。

正确做法:用整数存储单位(如“分”),或用 bcadd()/bcmul() 控制精度。

  • 推荐方式:工厂里写 'price' => fake()->randomFloat(2, 10, 1000)(Laravel 9+),它内部用字符串生成,避免 PHP 浮点污染
  • 手写时用 'price' => sprintf('%.2f', mt_rand(1000, 100000) / 100),确保输出是格式化后的字符串
  • Seeder 中批量插入大量数据时,避免用 collect([...])->each(...) 触发模型事件,直接用 DB::table()->insert() 更快,也绕过 Eloquent 的 cast 处理

最易被忽略的一点:MySQL 的 sql_mode 如果包含 STRICT_TRANS_TABLES(默认开启),任何精度超限都会报错;而关闭它只会警告,数据静默截断——线上环境千万别关 strict mode 来“绕过”问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

837

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

815

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2468

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3641

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

5150

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

3456

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

6529

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1376

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

195

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 197人学习

Composer手册
Composer手册

共0课时 | 0人学习