分类目录归档:MySQL

关于ip2long和MySQL的Bigint

今天小于在看有熊吐槽列表的时候发现了一个问题,有一些ip显示的是127.255.255.255这个值,显然,这个是一个保留地址,不是正确的用户IP,于是查找了一下原因。

问题出在PHP的ip2long方法在32位系统和64位系统上的表现不一致,在64位系统上ip2long对一部分IP计算后返回的整数大小超出了MySQL原先IP字段int(11)的上限2147483647,MySQL在对待溢出的整数值时采取了存入int(11)上限值的方式,于是那些超出范围的ip就被存成了2147483647。这时候用long2ip方法从MySQL中取回2147483647,计算得到的ip就是127.255.255.255这个错误的IP。

解决的方法有好几种,我现在选取了用Bigint字段代替Int(11)的方式来处理,暂时没有发现问题。