INT超过2147483647总是在PHP中转向2147483647

时间:2017-09-12 03:02:37

标签: php json laravel laravel-5.4

我的数据库ID大于2147483647(整数),所以当我将数据转换为Json时,如果我得到该ID,则转为2147483647。

这是我的json结果

[
    {"id":2147483647, "district_id":7171051, "name":"KARAME"},
    {"id":2147483647, "district_id":7171051, "name":"KETANG BARU"},
    {"id":2147483647, "district_id":7171051, "name":"WAWONASA"},
    {"id":2147483647, "district_id":7171051, "name":"TERNATE BARU"},
    {"id":2147483647, "district_id":7171051, "name":"TERNATE TANJUNG"},
    {"id":2147483647, "district_id":7171051, "name":"KOMBOS BARAT"},
    {"id":2147483647, "district_id":7171051, "name":"KOMBOS TIMUR"},
    {"id":2147483647, "district_id":7171051, "name":"SINGKIL SATU"},
    {"id":2147483647, "district_id":7171051, "name":"SINGKIL DUA"}
]

我的实际数据是

[
    {"id":7171051001, "district_id":7171051, "name":"KARAME"},
    {"id":7171051002, "district_id":7171051, "name":"KETANG BARU"},
    {"id":7171051003, "district_id":7171051, "name":"WAWONASA"},
    {"id":7171051004, "district_id":7171051, "name":"TERNATE BARU"},
    {"id":7171051005, "district_id":7171051, "name":"TERNATE TANJUNG"},
    {"id":7171051006, "district_id":7171051, "name":"KOMBOS BARAT"},
    {"id":7171051007, "district_id":7171051, "name":"KOMBOS TIMUR"},
    {"id":7171051008, "district_id":7171051, "name":"SINGKIL SATU"},
    {"id":7171051009, "district_id":7171051, "name":"SINGKIL DUA"}
]

我正在使用Laravel 5.4 如何使它成为我的实际身份证? 感谢。

2 个答案:

答案 0 :(得分:3)

在PHP中,你不能有大于PHP_INT_MAX的整数,它在32位硬件(或32位PHP)中是2147483647 = 2^31-1,这是你的数字{&#39}。得到(作为参考,在64位它9223372036854775807 = 2^63-1)。而且,您的原始数据,无论您从何处获取,都将ID作为字符串(请注意它们周围的引号)。

因此,当您将其强制转换为整数时,它会被截断为2147483647。现在,您有两种选择:

  • 将您的硬件/ PHP版本升级到64位。然而,如上所述,您仍然会有9223372036854775807限制,这显然要高得多。
  • 如果您没有使用您的ID进行任何算术运算,那么可以将它们保存为字符串。字母数字ID没有错。但是,在这种情况下,您必须小心将其视为整个堆栈中的字符串。

答案 1 :(得分:2)

在64x位平台上,PHP中的整数值大于2147483647。如果使用32x位平台,则限制最大整数值。 这个问题的另一个原因是PHP配置中的PHP_INT_SIZE var(php.ini)。

Json并不重要。

您可以阅读更多http://php.net/manual/en/language.types.integer.php