PHP 的 intval() 有点坑

2020-07-24

下午就准备上线新平台了,结果发现线上的数据库字段出现了问题。由于用户上传的图片数量较多,造成 JSON 数据过长,而该字段采用的是 varchar(255) 形式,因此多余的部分没有写入成功,PHP 再读取数据库的时候由于 JSON 格式错误,最终返回了 NULL。解决这个问题很简单,就是让运维重新修改数据库,但是他们那边的图片就只能重新上传了。

在测试预约单功能的时候发现了第二个问题,发现问题来源于 PHP 的 intval() 函数上。在线上版本的环境下,任何大于 2147483647 的数字从数据库中被取出,均会变成 2147483647。而比较奇怪的是,自己的电脑开发环境上却没有这样的问题。

正当我困惑不解的时候,坐我旁边的 Panda 同学和我提了提他此前用的一个非常鬼才的办法,就是将数字字符串本身 + 0,例如 13888888888 + 0。我试了一下,发现返回的数据确确实实是整型而不是字符串了!OhOhOhOhOhOhOhOh!上网查了下资料,发现这个函数是有一个“特性”的。

最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

真是坑爹的 PHP!可能我用的开发环境是 Unix,比较屌吧。而那个线上环境采用的却是 Windows Server,我好奇又去 Panda 的电脑上试了下,发现结果完全一致。那么问题来了,是 PHP 的版本问题,还是只是系统是 64 位,而 PHP 是 32 位的?有大神知道原因嘛,希望能解答一下 😅

配乐 郁闷
概览页 时间轴
奇趣音乐盒 技术源于 Kico Player
Emmm,这里是歌词君