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

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

时间:2024-05-21 08:57:06浏览次数:22  
标签:存储 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/gdjgs/p/18203246

相关文章

  • AnimationClip同步工具
    用途:列出动画的第1帧与预制体GameObject当前值不同的,需要同步的可以手动同步效果图 publicstructValueNotSameItem{publicEditorCurveBindingcurveBinding;//关联参数publicAnimationCurveanimCurve;//动画曲线publicfloatkfValue;//动画曲线上......
  • [Javascript] Perform Set Operations using JavaScript Set Methods
    The "SetMethods" proposalintroduces7newmethodstoJavaScript/ECMAScript:union(setB):ReturnsanewSetcontainingallelementsfromtheoriginalsetandanothersetsetB.Thismethodeffectivelycombinesthemembersoftwosetswithoutd......
  • Mac安装pipx
    前言由于本人在使用MacBook,而最近需要写一些python代码,所以就想着去装一个pip,但是安装的时候发现一些问题,所以做个记录以便查询。 错误报错如下:error:externally-managed-environment×Thisenvironmentisexternallymanaged╰─>ToinstallPythonpackagessystem......
  • mit6.828笔记 - lab4 Part C:抢占式多任务和进程间通信(IPC)
    PartC:抢占式多任务和进程间通信(IPClab4到目前为止,我们能够启动多个CPU,让多个CPU同时处理多个进程。实现了中断处理,并且实现了用户级页面故障机制以及写时复制fork。但是,我们的进程调度不是抢占式的,现在每个进程只有在发生中断的时候,才会被调度(调用shed_yeild),这样就有可能会有......
  • TypeScript入门介绍
    目录TypeScript入门介绍什么是TypeScript?发展历史优缺点应用场景开发工具环境依赖编程IDEvs调试构建工具/工程化步骤汇总第一个项目TypeScript入门介绍什么是TypeScript?1.1TypeScript是由微软开发的一种开源的编程语言。它是JavaScript的一个超集,通过为JavaScript提供......
  • MySQL数据类型
    数值类型tinyint-特小型整数(年龄)-1byte-范围有符号-128~127,无符号0~255smallint-小型整数-2byte(16bit)-范围有符号-32768~327670~65535mediumint-中型整数-3byte--2^31~2^31-10~2^32-1int/integer-整数型默认int-4bytebigint-大型整数,当in......
  • 9-2-zip管理压缩文件
    9.2zip管理压缩文件命令:zip压缩后的名称.zip压缩前的文件路径 例1:压缩某一路径下所有的图片 解压所有的图片的zip压缩包,到当前目录,命令:unzip文件名.zip  解压所有的图片的zip压缩包,到指定目录,......
  • what's the advantages of using Map over Object in JavaScript?
    what'stheadvantagesofusingMapoverObjectinJavaScript?在JavaScript中使用Map相对于Object有什么优势?prosconsdemoshttps://leetcode.com/studyplan/30-days-of-javascript/(......
  • P1057 [NOIP2008 普及组] 传球游戏
    链接:https://www.luogu.com.cn/problem/P1057思路:左手倒右手,建立递推方程建立初始参数:定义dp[j][k]是第k次,以j结尾的方法,就是传k次最后传到j的方法。那么状态转移方程:dp[j][k]=dp[next][k-1]+dp[before][k-1]。其中before是j的前一个元素(j-1);next是j的后一个元素j+1。同时要注......
  • opensips开启lua支持
    操作系统:CentOS7.6_x64opensips版本:2.4.9lua版本:5.1今天整理下CentOS7环境下opensips2.4.9的lua模块笔记及使用示例,并提供运行效果截图。我将从以下几方面进行展开:模块安装说明模块参数说明模块函数说明模块使用示例lua模块官方文档:https://opensips.org/do......