首页 > 解决方案 > 将 Bigint 数与 1 相加无法得到正确的结果

问题描述

我正在创建其中 stud_id 列是 unsigned bigint(250) 的招生表。我正在应用查询“更改表准入 AUTO_INCREMENT = 2001923456789000;在 php 编码中,我正在获取最后一个索引并将 1 添加到其中,但我得到错误的结果请给出解决方案。结果为指数格式。

$sql="select MAX(id) from com_result"; 
$result=mysql_query($sql) or die(mysql_error()); 
if($row=mysql_fetch_array($result)) { 
     $id=$row[0]; 
     $stud_id1=$id+1; 
     echo "<input type='text' class='form-control' id='id' name='id' readonly value=".$stud_id1.">"; 
}

标签: phpmysql

解决方案


您基本上达到了 PHP 中整数值的最大限制。正如您在评论echo PHP_INT_MAX;中所证实的那样,您服务器上的结果是: 2147483647。(所以,基本上是一个 32 位的 PHP 版本)。

一种选择是使用 64 位版本在您的服务器上重建 PHP。检查此答案以了解不同构建的整数范围的差异:https ://stackoverflow.com/a/2842548/2469308

现在,在您当前的情况下,从 MySQL: 获得的数字2001923456789000基本上是overflowing,因为它远高于整数的最大允许值。这就是您看到错误结果的原因,因为一旦超过限制,PHP 就会倒退并从允许的最低负整数值开始,依此类推..(以循环为单位)

现在,为了在 32 位 PHP 中解决这个问题,您必须将从 MySQL 获得的结果显式类型转换Float为数据类型。浮点数可用于最大为 2^53 + 1 的整数值

尝试以下操作:

if($row=mysql_fetch_array($result)) { 
     $id = (float)$row[0];  // <-- Typecasting to float
     $stud_id1 = $id + 1; 
     echo "<input type='text' class='form-control' id='id' name='id' readonly value=".$stud_id1.">"; 
}

推荐阅读