php中int类型最大值的处理

2016-07-14 10:04:00
hainuo
原创 1719
摘要:php中是如何确认最大整形的,又是如何处理整形的,隐式转换是怎么做的
###0x01 问题产生原因朋友用20位的整形作为订单号写入到mysql中但是使用这20位整形进行查询的时候出现问题,查出来的数据总是不正确。场景还原![](https://blog.hainuo.info/data/upload/201607/f_53f20d2236f01c1c66be0f2a69b8b865.jpg)###0x02 查找原因通过叶金荣老师帮助,发现这个是隐式转换,导致查询结果不正确。ps: 事情出现是在7月13日,到7月14日才真正警觉是MySQL的隐式转换,因为7月13日测试将sql中的引号去掉后是可以的。这是后话后面再说MySQL的事情###0x03 排查问题通过排查代码发现起源是在get方式传递参数时候,20位的整数被识别为字符串,于是我的主要方向转向了将字符串转换成整数 。###0x04 重点来了我们一听说转换应该就是使用`intval()`方法,但是,这时候出现了严重问题,通过intval()后得到的数值是`9223372036854775807 ` (这个值为2^63-1 与 PHP_INI_MAX 相同) PHP中海油很多数学扩展 比如GMP 比如BCMath 等等###0x04经查询 PHP_INI_MAX(9E18)和PHP_INI_SIZE (8bit)两个PHP常量是由系统来定的,括号中显示的64位系统上的常量值。这个是无法被更改的。###0x05 解决办法 1. 将20位变成18位满足最大值的限定,根据实际情况`20160629151227516222`生成规则为年月日时分秒各两位加随机码,为保证随机数足够多,所以年份由4位改为2位于是变成18为整形`160629151227516222`,但是这个不通用只是针对这个生成规则来的。2. 在msyql执行查询时进行数字转换。ps: 2016年7月14日为真机测试发现竟然能够搜索到如图![](https://blog.hainuo.info/data/upload/201607/f_8162b6c35d4cfa76c96d0552cd351d3d.jpg)![](https://blog.hainuo.info/data/upload/201607/f_db48f00c6a3495b955bca1513747cca7.jpg)询问对方数据版本为mariadb![](https://blog.hainuo.info/data/upload/201607/f_1ae16aafb4340c5508d44470ef2b5d0e.jpg)难道是这个mariadb的坑,需要他来背锅?我的mysql版本如下![](https://blog.hainuo.info/data/upload/201607/f_102287a44529923843da821423654121.jpg)###0x06 need your helpRT php的最大整形问题无解,那么这个真实的案例该怎么做?
发表评论
贰 乘 壹 =
评论通过审核后显示。