0
点赞
收藏
分享

微信扫一扫

Java之ip地址存储的数据类型

ZMXQQ233 2022-01-17 阅读 32
java

在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));
    }

}

在此记录一下。

举报

相关推荐

0 条评论