PHP随机将大整数递减1

时间:2015-10-06 11:48:15

标签: php mysql json

我偶然发现了一个奇怪的错误/问题。

我有一个MySQL表,其中一列填充了数字(BIGINT)。这些数字对于常规的32位整数来说太大了,因此PHP会将它们转换为32位的字符串。这样每次都能得到正确的结果。

当在64位PHP上运行并且没有强制转换为json_encode的字符串时,结果将有时减1,这样像1293203059233这样的数字变为1293203059232.这是显然没有好处。奇怪的是我看不到任何模式。

它不是随机发生的,因为MySQL中的一行有时会递减,有时也不会递减,但是总是会递减相同的整数/行,并且总是递减1.

是什么导致这个?我使用stdClassarrays() - 对象或mysqli转换为文本,然后通过常规HTTP响应发送它们。

$stmt = $sql->prepare->("SELECT BIGNUMBER FROM table WHERE SOMEID = ?"); $stmt->bind_result($bignumber); $stmt->bind_param("i",$someid); $stmt->execute(); $stmt->fetch(); $stmt->close(); $obj = new stdClass(); $obj->number = $bignumber; echo json_encode($obj); 使用预先准备的语句检索行,如:

10205160559939609 -> 10205160669939608 // bad

我已经验证浏览数据库表时所有整数都是正确的。

一些例子(这些是实际值):

没有强制转换为字符串:

10205160559939609 -> "10205160559939609" // good

使用:

10154493437278508 -> 10154493437278508 // good (?)

没有强制转换为字符串:

10154493437278508 -> "10154493437278508" // good

with:

as Strng: (used error_log((string)$number);)
10205160559939609
as int: (used error_log($number);)
10205160559939609

编辑:我做了一个error_log测试pre-json_encode来测试,产生:

{{1}}

这表明php确实获得了正确的值,并且错误发生在php json_encode或浏览器的解码方法中。

1 个答案:

答案 0 :(得分:2)

只需在Chrome控制台中键入10205150669939609即可打印出10205150669939608(舍入效果)。我想这个整数在JS中无效,所以它们也不应该是JSON。如果我的值很大,我就会使用字符串。