首页 > 其他分享 >如果要存ip地址,用什么数据类型比较好

如果要存ip地址,用什么数据类型比较好

时间:2024-04-25 09:35:09浏览次数:14  
标签:存储 0.1 ip 数据类型 IP 字符串 要存 append

在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。 但是没有给出具体原因。

 

为了搞清楚这个原因,查了一些资料,记录下来。

 

相对字符串存储,使用无符号整数来存储有如下的好处:

 

  • 节省空间,不管是数据存储空间,还是索引存储空间
  • 便于使用范围查询(BETWEEN...AND),且效率更高

 

通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)即可。MySQL在保存变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节即可。

 

另外还可以使用4个字段分别存储IPv4中的各部分,但是通常这不管是存储空间和查询效率应该都不是很高(可能有的场景适合使用这种方式存储)。

使用字符串和无符号整数来存储IP的具体性能分析及benchmark,可以看这篇文章。

https://bafford.com/2009/03/09/mysql-performance-benefits-of-storing-integer-ip-addresses/

使用无符号整数来存储也有缺点:

 

  • 不便于阅读
  • 需要手动转换

 

对于转换来说,MySQL提供了相应的函数来把字符串格式的IP转换成整数INET_ATON,以及把整数格式的IP转换成字符串的INET_NTOA。如下所示:

 

mysql> select inet_aton('192.168.0.1');
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
|               3232235521 |
+--------------------------+
1 row in set (0.00 sec)

mysql> select inet_ntoa(3232235521);
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1           |
+-----------------------+
1 row in set (0.00 sec)

对于IPv6来说,使用VARBINARY同样可获得相同的好处,同时MySQL也提供了相应的转换函数,即INET6_ATON和INET6_NTOA。

 

对于转换字符串IPv4和数值类型,可以放在应用层,下面是使用java代码来对二者转换:

package com.mikan;

/**
 * @author Mikan
 */
public class IpLongUtils {
    /**
     * 把字符串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"));
    }

}

输出结果为:

3232235521
192.168.0.1
167772161

 

- END -

为了搞清楚这个原因,查了一些资料,记录下来。

标签:存储,0.1,ip,数据类型,IP,字符串,要存,append
From: https://www.cnblogs.com/shujuyr/p/18156891

相关文章

  • WPF 使用 ManipulationDemo 工具辅助调试设备触摸失效问题
    本文将和大家介绍我所在的团队开源的ManipulationDemo工具。通过ManipulationDemo工具可以提升调试设备触摸失效的效率此工具在GitHub上完全开源,请看https://github.com/dotnet-campus/ManipulationDemo/软件界面效果大概如下可以显示接收到的Win32消息、当前的触摸......
  • WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的
    本文记录WPF的一个已知问题,在RepeatButton上开启IsManipulationEnabled漫游支持之后,将会导致触摸长按到RepeatButton之上时,不会收到源源不断的Click事件这是有个伙伴在WPF官方仓库报告的问题,详细请看https://github.com/dotnet/wpf/issues/8223原始的问题是他发现......
  • typeScript的安装使用与问题记录
    安装typeScript: npminstall-gtypescript随后安装报错,提示: 解决方法如下: 安装成功后,tsc-v无法查询到typeScript版本错误信息为: 尝试:更改执行策略搜索栏中搜索:PowerShell(管理员命令打开)输入命令:set-ExecutionPolicyRemoteSigned(选择Y)输入验证命令:get-Execut......
  • tar和zip包加密解密压缩
      1、概述嗯,最近有些机密文件无处安放,因为太机密了,后来确定加密后放到服务器上。研究一番后发现tar和zip命令都能实现,所以在此记录一下。 2、加密在packageTest目录中有两个文件,我们的目标是将整个packageTest目录进行加密压缩,[root@localhostjar]#ll./packageTest总......
  • JavaScript 如何实现一个响应式系统
    JavaScript如何实现一个响应式系统第一阶段目标数据变化重新运行依赖数据的过程第一阶段问题如何知道数据发生了变化如何知道哪些过程依赖了哪些数据第一阶段问题的解决方案我们可用参考现有的响应式系统(vue)vue2是通过Object.defineProperty实现数据变化的监控,详......
  • Converge: QoE-driven Multipath Video Conferencing over WebRTC 概略
    这是一片2023sigcomm的文章。论文指出多摄像头(multiplecamera)和高分辨率(highresolution)场景下,视频会议的QoE还有提升空间,而作者将提升QoE的目光转到多路传输(multipath)上。所以总体来看这是一篇利用多路传输来优化视频会议体验的文章。常用的多路协议包括MPTCP,MPQUIC,MPRTP经过......
  • P3953 [NOIP2017 提高组] 逛公园
    P3953[NOIP2017提高组]逛公园求有向图中\(1\)到\(n\)的路径中长度小于等于\(dis(1,n)+k\)的方案数。\(dis(1,n)\)表示最短路。\(k\le50\)。部分分\(k=0\),直接最短路计数即可。我们发现有向图中存在后效性,不好动态规划,但我们仔细思考后,在不存在\(0\)边的情况下,设......
  • P7114 [NOIP2020] 字符串匹配
    P7114[NOIP2020]字符串匹配看到循环部分\(AB\),自然想要去枚举它,并且用哈希。开始想到的是倍增+hash求出最长循环的右端点,复杂度是\(O(n\logn)\),结果不好写,没写出来。我们先思考找到右端点怎么计算贡献。最朴素的,我们再枚举前缀\(ABAB\cdotsAB\),容易预处理出后缀出现奇数......
  • P8866 [NOIP2022] 喵了个喵
    P8866[NOIP2022]喵了个喵构造模拟题,思路很简洁,但是代码不好写。首先看到数据范围,发现\(k\)的数据范围很特殊,种类少一种就是部分分,所以\(k\)一定是关键的,先思考\(k=2n-2\)的情况。\(k=2n-2\)观察两种操作,对于即将进入的牌\(x\),若某个栈顶或栈底有相同的\(x\),我们都可......
  • P7961 [NOIP2021] 数列
    P7961[NOIP2021]数列这题想了一半,后面有点不敢想结果直接看题解了。思考后发现,对于\(a_i\lex\),也就是二进制中第\(x\)位前的部分,它们都可能会影响到二进制中第\(x\)位后的进位,而\(a_i>x\)的部分是不会影响到\(x\)位前的进位的。所以为了满足无后效性,我们从低位向高......