如何在PHP中使用Int64(长整型)而不是字符串?

4

如何在php中像dotnet、java、c++一样使用Int64?

例如:

mysql中数据类型为bigint(20),我想从php中保存值。我知道一个解决方案是在mysql存储过程中使用字符串。

表格案例:

CREATE TABLE `test_int64` (
  `id` bigint(20) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

MySQL存储过程案例:

CREATE PROCEDURE `sp_test_int64`(IN p_id VARCHAR(20))
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
     INSERT INTO test_int64(id) VALUES(p_id+0);
END;

PHP代码案例:

$id = '1660820628901389';  Then execute sql 'call sp_test_int64(\''.$id.'\')'

以上方法可以,但我不想这样做。还有其他解决方案吗?

例子2:

我想使用PHP读取MYSQL数据并输出JSON代码,像这样:

{
    "id":1660820628901389
}

但不包括:

{
    "id":"1660820628901389"
}

我不知道该怎么做?

你的服务器CPU架构是64位的吗?你的PHP二进制文件是编译为64位的吗? - Mahn
MySQL内部不应该需要进行类型转换,它应该把数字字符串隐式转换成int64。 - Ja͢ck
@Mahn 我认为 CPU 是 32 位或 64 位都无所谓!只和数据类型有关。另外,我的 CPU 是 64 位的。 - slimboy
1个回答

6
PHP中的INT类型与CPU和安装的PHP版本相关联(您可以在64位CPU上安装32位PHP)。要查找PHP支持的最大整数,请简单地执行以下操作:
echo PHP_INT_MAX;

这将给你最大值。它将给你2亿,或者一个太大而无法阅读的巨大数字(约为9.2 gazillion)。

请注意,它是有符号的(-20亿-> +20亿,或-9 gazillion-> +9 gazilion)。虽然在MySQL中可以指定无符号,但在PHP中没有这个选项。

如果您只有20亿的限制,则安装了32位版本的PHP。您可以在64位CPU上安装PHP 64位,或者您需要将其处理为字符串,或者您可以使用BC Math函数将从MySQL返回的字符串转换为数字,但我不确定JSON_encode是否能够处理它*。如果您有大数字,则应该没问题,可以处理为整数。

  • JSON_encode注意事项:过去我注意到JSON_encode和serialize会将大数字转换为浮点数,然后在内部失去精度,即使它们是整数。我最近没有测试过或在64位上测试过,但这是另一个要注意的陷阱。

编辑:这是手册中相关页面的链接:http://php.net/manual/en/language.types.integer.php。它还添加了GMP作为BC Math的替代方案。


非常感谢。 我的PHP_INT_MAX是9223372036854775807。 - slimboy
由于您似乎正在运行64位版本,要解决您的JSON“问题”,只需在将其与JSON一起使用之前将变量强制转换为整数即可(例如(int) $gazillionID)。 - Mahn
@Mahn Yea,你说得对。起初我还以为错了。谢谢! - slimboy
在dotnet中,CPU是32位或64位并不重要。你可以使用int32或int64(例如int.Parse("1234") Int64.Parse("1660820628901389")),但PHP则不同。起初我以为它们是相同的,但实际上并不是这样。 - slimboy
@slimboy。抱歉回复晚了。正如Mahn所说(感谢),您应该能够在数组中简单地强制转换为int并将其转换为JSON。正如我所希望的那样,如果您得到X.00001或X.99997等,则在内部将其转换为浮点数,并且您需要手动处理它(它无法很好地处理浮点数)-但是我已经很久没有看到这个问题了,我怀疑这仍然是一个问题。 - Robbie
@Robbie 不用在意!关于 int 值的范围,我认为 9223372036854775807 已经足够满足我的需求了。现在我按照 Mahn 的建议来做(例如:(int)$data["id"])。 - slimboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接