mysql利用INET_ATON或INET_NTOA比较ip

  • INET_ATON(expr)

给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。

mysql> SELECT INET_ATON('209.207.224.40');

        -> 3520061480

产生的数字总是按照网络字节顺序。如上面的例子,数字按照 209×2563 + 207×2562 + 224×256 + 40进行计算。

INET_ATON() 也能理解短格式 IP 地址:

mysql> SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');

        -> 2130706433, 2130706433

注释: 在存储由INET_ATON() 产生的值时,推荐你使用 INT UNSIGNED 列。假如你使用 (带符号) INT列,则相应的第一个八位组大于127的IP 地址值会被截至  2147483647 (即, INET_ATON('127.255.255.255')所返回的值)。请参见11.2节,“数值类型”

  • INET_NTOA(expr)

给定一个数字网络地址 (4 或 8 比特),返回作为字符串的该地址的电地址表示。

mysql> SELECT INET_NTOA(3520061480);

-> '209.207.224.40'

 

将表中两个ip转换成int型,再进行ip比较    

UPDATE t_terminal_menu SET s=INET_ATON(trade_id),e=INET_ATON(id);

/**
*通过ip获取地区信息
*/
public IpInfo getIpInfoByIp(String ipAddress) {
  if(null == ipAddress || !isIp(ipAddress)){
   return null;
  }
  try {
   Long ipNum = getIpNum(ipAddress);
   String hql = "select * from IpInfo where s<=" + ipNum + " and e>=" + ipNum;
   List<IpInfo>  listIpInfos = getBaseDao().query(hql);
   if(null != listIpInfos && listIpInfos.size() > 0){
    return listIpInfos.get(0);
   }else{
    return null;
   }
  } catch (Exception e) {
   e.printStackTrace();
   throw new ServiceException("根据ip获取地区信息失败");
  }
}
/**
*将ip转换成int型
*/
 public  long getIpNum(String ipAddress){    
     String[] ip = ipAddress.split("\\.");       
      return Long.parseLong(ip[0]) * 256 * 256 * 256L + Long.parseLong(ip[1]) * 256 * 256L + Long.parseLong(ip[2]) * 256L + Long.parseLong(ip[3]);     
 }         
/**
*判断是不是ip
*/
 public boolean isIp(String ipAddress)  { 
        String ip = "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))";  
        Pattern pattern = Pattern.compile(ip);  
        Matcher matcher = pattern.matcher(ipAddress);  
        return matcher.matches();  
 } 
  • trade_id:开始ip
  • id:结束ip 
  • s:转换成int型的开始ip
  • e:转换成int型的结束ip

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值