php中int類型最大值的處理

2016-07-14 10:04:00
hainuo
原創 1903
摘要: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的最大整形問題無解,那麽這箇真實的案例該怎麽做?
發錶評論
伍 加 陸 =
評論通過審核後顯示。