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  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

mysql利用INET_ATON或INET_NTOA比较ip_第1张图片

你可能感兴趣的:(mysql)