在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 { 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]); } 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)); } }
在此记录一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)