Laravel中MySQL整数列转Decimal/Float的选型及数据兼容问题
关于MySQL分数字段类型选择及数据迁移的问题解答
一、Decimal vs Float:选哪个更合适?
毫无疑问应该选Decimal类型,原因很直白:
- Float(包括Double)属于浮点型,采用近似值存储逻辑,会存在精度丢失的隐患。比如你想存
10.40,实际底层可能会被存成10.3999999999,虽然前端显示可能看起来正常,但做精确计算或数值比对时就会出问题,完全不符合你“保留两位小数及末尾零”的需求。 - Decimal是精确数值类型,它会严格按照你定义的精度(这里是两位小数)存储数值,
10.40就存10.40,10.47就存10.47,末尾的零也能完整保留,完美匹配你的业务场景。
二、执行$table->decimal('user_score', 8, 2)->change();会不会破坏现有数据?
放心,这个操作不会破坏原有Integer类型的数据,MySQL会自动完成安全的类型转换:
- 原有整数会被自动转换成带
.00的Decimal值,比如原来的5会变成5.00,123会变成123.00,数值本身完全保留,只是格式变成了带两位小数的形式。 - 不过有个细节要注意:你定义的Decimal是
(8,2),这代表总位数是8位(包含小数部分),小数占2位,所以整数部分最多能存6位(比如最大值是999999.99)。如果你的原有Integer字段里有超过999999的数值,转换时会被截断成999999.99,这就会丢失数据了。所以执行前一定要先检查现有数据的最大值,确保它不超过999999。
另外,保险起见,建议你先在测试环境执行这个迁移,验证数据转换结果,或者先给表做个备份,再在生产环境操作。
内容的提问来源于stack exchange,提问作者Packy
相关产品推荐
相关产品推荐

