Laravel存储INT类型数据到数据库时自动变为负数如何解决
问题原因
核心为32位PHP环境的整型溢出,具体逻辑如下:
- 你使用的
invoice_id值为20210126075173,长度为14位,远大于32位有符号整型的最大值2147483647(2^31-1,共10位)。 - 本地环境运行的是64位版本PHP,64位有符号整型最大值为
9223372036854775807,完全可以容纳该数值,因此存储正常。 - 正式服务器运行的是32位版本PHP,数值超过最大整型阈值后会发生溢出绕回,符号位翻转后就会得到你看到的负数结果
-1990019803。 - 此前修改数据库字段类型为VARCHAR、INT、BIGINT都无法解决问题,是因为错误值在PHP代码执行阶段就已经生成,写入数据库的已经是溢出后的错误值,和数据库字段类型无关。
解决方案
可根据实际运维条件选择以下任意一种方案:
- 方案1:将正式服务器的PHP替换为64位版本,直接从底层解决整型长度限制问题,无需修改现有业务代码。
- 方案2:如果无法更换服务器PHP版本,业务流程中全程用字符串类型处理
invoice_id:生成时直接输出字符串格式,传递、写入数据库过程中不做任何整型转换操作,数据库字段保持VARCHAR即可。 - 方案3:如果要求
invoice_id必须为数值类型,调整生成规则将数值长度缩短到10位以内,确保数值不超过32位有符号整型最大值2147483647。
内容的提问来源于stack exchange,提问作者OminousMusic
相关产品推荐
相关产品推荐

