- 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