問題:服務器數據庫中保存ip地址字段用的是有符號整形類型。這樣當保存的ip地址ip2long大於2147483647(127.255.255.255)後保存在數據庫中的值都是2147483647了。
原因:
大於127.255.255.255的ip地址ip2long後的數值範圍超過了字段的存儲範圍。由於服務器數據庫沒有打開嚴格模式,這樣超過數據範圍的數據就按最大範圍值保存了也就是2147483647。
深入:
爲了查找原因我在本地機器上ip2long(128.0.0.0)得到的結果是-2147483648。爲什麼服務器上保存到數據庫中的數據卻都是正整數。經過上網搜索和PHP手冊的查找。發現是int的數值範圍引起的。
php手冊上有這麼一句話:整型數的字長和平臺有關,儘管通常最大值是大約二十億(32 位有符號)。PHP 不支持無符號整數。
本機是windows32爲系統,這樣保存int的範圍是-2^32/2到2^32-1.而服務器上是64位系統這樣保存的數值範圍就比windows32下的多了。
爲了驗證猜想: