在java开发中,会遇到处理ip地址信息的需求,下面一起看看其应用方式。
通常情况下,mysql数据库中大家都会用字符串来存储ip地址,首先这样是可以的,没什么问题。那有没有其他的存储数据类型,其优缺点如何。
- 无符号整数方式
节省空间,不管是数据存储空间,还是索引存储空间
便于使用范围查询,between,且效率高
需要4个字节存储,采用字符串时,一个ipv4最小需要7个字符,最大需要15个字符,使用varchar(15),且还额外需要一个字节来保持字符串的长度
不便于阅读
需要手动转换(代码实现工具类)
- 其他方式,如分别存储ipv4中的各个部分,还需考虑其引用场景和需求
在mysql中,已提供相应的函数去处理ip地址的字符串和整数之间的转换,如下
select inet_aton('192.168.0.1');//3232235521
select inet_ntoa(3232235521);//192.168.0.1
对于ip地址的2种数据类型转换通过代码的方式,如下
public class IpLongUtil {
/**
* 把字符串IP转换成long
*
* @param ipStr 字符串IP
* @return IP对应的long值
*/
public static long ip2Long(String ipStr) {
String[] ip = ipStr.split("\\.");
return (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16)
+ (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
}
/**
* 把IP的long值转换成字符串
*
* @param ipLong IP的long值
* @return long值对应的字符串
*/
public static String long2Ip(long ipLong) {
StringBuilder ip = new StringBuilder();
ip.append(ipLong >>> 24).append(".");
ip.append((ipLong >>> 16) & 0xFF).append(".");
ip.append((ipLong >>> 8) & 0xFF).append(".");
ip.append(ipLong & 0xFF);
return ip.toString();
}
public static void main(String[] args) {
System.out.println(ip2Long("192.168.0.1"));
System.out.println(long2Ip(3232235521L));
System.out.println(ip2Long("10.0.0.1"));
System.out.println(long2Ip(167772161L));
}
}
在此记录一下。