phpMyAdmin中BigInt值末尾始终为0的问题排查
解决Bigint插入末尾变0的问题
哎,这个问题我之前也踩过坑!核心原因是JSON解码时大数字被自动转成了浮点型(float),而float的精度不足以存储你这么长的数字,导致末尾的精确位被截断成0了。
为什么会出现这个情况?
PHP里的json_decode()默认会把JSON中的数字转成int或float:
- 如果数字在PHP int的范围内(64位系统是
9223372036854775807以内,32位是2147483647),会转成int; - 超过这个范围的话,就会自动转成float,但float的有效精度只有15-17位,你的
1591823907560714是16位,刚好卡在精度边缘,转成float后就会丢失末尾的精确值,变成类似1591866907560700这样的结果。
怎么解决?
你需要在json_decode时指定JSON_BIGINT_AS_STRING选项,让大数字以字符串形式保留,这样就不会丢失精度:
$user = json_decode(file_get_contents("php://input"), false, 512, JSON_BIGINT_AS_STRING);
简单解释下参数:
- 第三个参数
512是递归深度,用默认值就行; - 第四个参数
JSON_BIGINT_AS_STRING告诉解析器把超出int范围的大数字当成字符串处理,而不是转成float。
插入数据库的注意事项
拿到字符串形式的数字后,直接插入bigint字段就可以了——MySQL的bigint类型可以接收合法的数字字符串,会自动转换成对应的数值存储,不会有精度损失。
你可以先打印一下$user里的那个数值,看看是不是已经变成字符串了,确认问题解决后再插入数据库~
内容的提问来源于stack exchange,提问作者Elliott08
相关产品推荐
相关产品推荐

