SELECT hub_gid FROM CPP_HUB_IPSEGMENT WHERE IpToLong(#{ip}) BETWEEN IpToLong(ip_begin) AND IpToLong(ip_end)
oracle实现方式:创建oracle函数
-- 把ip转换成long型
CREATE OR REPLACE FUNCTION IpToLong(ip2 in varchar2)
return number
is
p1 number;
p2 number;
p3 number;
ip varchar2(32);
begin
p1 := instr(ip2, ':', 1, 1);
if(p1 > 0) then
ip := substr(ip2, 1, p1 -1);
else
ip := ip2;
end if;
p1 := instr(ip, '.', 1, 1);
p2 := instr(ip, '.', 1, 2);
p3 := instr(ip, '.', 1, 3);
return to_number(substr(ip, 1, p1-1))*256*256*256 + to_number(substr(ip, p1+1, p2-p1-1))*256*256 + to_number(substr(ip, p2+1, p3-p2-1))*256 + to_number(substr(ip, p3+1));
end;
/
-- 把long型的ip转换成ip格式
CREATE OR REPLACE FUNCTION LongToIp(ip in number)
return varchar2
is
begin
return floor(ip/65536/256) || '.' || mod(floor(ip/65536), 256) || '.' || mod(floor(ip/256), 256) || '.' || mod(ip, 256);
end;
/
2、mysql实现方法:
如果需要找出在某个网段的用户(例如:172.16.11.1 ~ 172.16.11.100),可以利用php的ip2long方法,把ip地址转为整型,再进行比较。<?php $ip_start = '172.16.11.1'; $ip_end = '172.16.11.100'; echo 'ip2long(ip_start):'.sprintf('%u',ip2long($ip_start)); // 2886732545 echo 'ip2long(ip_end):'.sprintf('%u',ip2long($ip_end)); // 2886732644 ?>