0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用字符串和无符号整数来存储IP的具体性能分析

Android编程精选 来源:CSDN技术社区 作者:MikanMu 2022-06-20 16:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。但是没有给出具体原因。为了搞清楚这个原因,查了一些资料,记录下来。

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

  • 节省空间,不管是数据存储空间,还是索引存储空间

  • 便于使用范围查询(BETWEEN...AND),且效率更高

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

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

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

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

  • 不便于阅读

  • 需要手动转换

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

mysql>selectinet_aton('192.168.0.1');
+--------------------------+
|inet_aton('192.168.0.1')|
+--------------------------+
|3232235521|
+--------------------------+
1rowinset(0.00sec)

mysql>selectinet_ntoa(3232235521);
+-----------------------+
|inet_ntoa(3232235521)|
+-----------------------+
|192.168.0.1|
+-----------------------+
1rowinset(0.00sec)

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

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

packagecom.mikan;

/**
*@authorMikan
*/
publicclassIpLongUtils{
/**
*把字符串IP转换成long
*
*@paramipStr字符串IP
*@returnIP对应的long值
*/
publicstaticlongip2Long(StringipStr){
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值转换成字符串
*
*@paramipLongIP的long值
*@returnlong值对应的字符串
*/
publicstaticStringlong2Ip(longipLong){
StringBuilderip=newStringBuilder();
ip.append(ipLong>>>24).append(".");
ip.append((ipLong>>>16)&0xFF).append(".");
ip.append((ipLong>>>8)&0xFF).append(".");
ip.append(ipLong&0xFF);
returnip.toString();
}

publicstaticvoidmain(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

原文标题:如果要存 IP 地址,用什么数据类型比较好?99%人都会答错!

文章出处:【微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4697

    浏览量

    89578
  • IP
    IP
    +关注

    关注

    5

    文章

    1849

    浏览量

    154933
  • 字符串
    +关注

    关注

    1

    文章

    594

    浏览量

    23044
  • MySQL
    +关注

    关注

    1

    文章

    897

    浏览量

    29240

原文标题:如果要存 IP 地址,用什么数据类型比较好?99%人都会答错!

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    网络通讯的结构及地址

    )。 inet_ntop():网络字节序整数字符串(network → presentation)。 示例: struct sockaddr_in addr; // 字符串IP
    发表于 11-17 07:59

    芯源都有哪些开发工具?具体性能如何?

    芯源都有哪些开发工具?具体性能如何?
    发表于 11-14 07:58

    Verilog实现使用Booth编码和Wallace树的定点补码乘法器原理

    周期乘法器。乘法器,对于符号乘法进行一位符号扩展后统一当作有符号数进行运算,因此需要17个迭代周期。为了改良乘法器性能,我们可以使用Boo
    发表于 10-23 08:01

    非对称密钥生成和转换规格详解

    SM2密钥,且支持通过曲线名生成公共密钥参数。 使用字符串参数生成 当前支持以字符串参数生成SM2密钥,具体的“字符串参数”由“非对称密钥算法”和“密钥长度”使用
    发表于 09-01 07:50

    labview如何生成一个带字符串返回的dll

    labview如何生成一个dll,如下图,要求一个输入,类型是字符串,返回类型也是字符串
    发表于 08-28 23:20

    在Python中字符串逆序有几种方式,代码是什么

    的方法 方法一:直接使用字符串切片功能逆转字符串 #!usr/bin/envpython #encoding:utf-8 defstrReverse(strDemo): returnstrDemo
    的头像 发表于 08-28 14:44 786次阅读

    harmony-utils之StrUtil,字符串工具类

    harmony-utils之StrUtil,字符串工具类 harmony-utils 简介与说明 [harmony-utils] 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类
    的头像 发表于 07-03 11:32 377次阅读

    光纤配线架的抗震与抗冲击性能具体是哪些

    光纤配线架的抗震与抗冲击性能是其关键可靠性指标,尤其在数据中心、通信基站或工业场景中,需确保在震动、冲击或意外碰撞下光纤连接稳定、中断。以下是具体性能要求及实现方式: 一、抗震性能
    的头像 发表于 06-11 10:38 599次阅读
    光纤配线架的抗震与抗冲击<b class='flag-5'>性能</b><b class='flag-5'>具体</b>是哪些

    #### KEPServerEX 数据存储插件\\-2

    ,同类型的/同设备的参数可以设置成一样的,这样存储到数据库之后,能够更方便的在数据库中进行检索。 默认“数据项ID”是整形数据,如需填写字符串等数据类型,可以将“LogGroup”里面的“将数字项ID映射
    发表于 04-09 16:09

    请问如何用Verilog实现将ascaii码数值字符串转换成定点数?

    我需要接收一个ascaii码字符串,内容是12位有效数字的数值,带小数。我不知道怎么把小数部分转换成定点数。
    发表于 01-23 21:57

    字符串在数据库中的存储方式

    数据库是现代信息技术中存储和管理数据的核心组件。字符串作为最常见的数据类型之一,在数据库中的存储方式对其性能和可扩展性有着重要影响。 数据类型 固定长度
    的头像 发表于 01-07 15:41 1255次阅读

    字符串在编程中的应用实例

    字符串在编程中有着广泛的应用,它们被用于表示文本数据、处理用户输入、构建动态内容等。以下是一些字符串在编程中的应用实例: 1. 用户输入与输出 用户输入 :程序通常需要从用户那里获取输入,这些输入通
    的头像 发表于 01-07 15:33 1138次阅读

    字符串字符数组的区别

    在编程语言中,字符串字符数组是两种基本的数据结构,它们都用于存储和处理文本数据。尽管它们在功能上有一定的重叠,但在内部表示、操作方式和使用场景上存在显著差异。 1. 内部表示 字符串
    的头像 发表于 01-07 15:29 1689次阅读

    字符串反转的实现方式

    在编程中,字符串反转是一个基础而重要的操作,它涉及到将一个字符串中的字符顺序颠倒过来。这个操作在多种编程语言中都有不同的实现方式,本文将探讨几种常见的字符串反转方法。 1. 递归方法
    的头像 发表于 01-07 15:27 1249次阅读

    字符串处理方法 字符串转数字的实现

    () 和 float() 函数将字符串转换为整数和浮点数。 python复制代码 # 转换为整数str_num = "123"num = int(str_num)print(num) # 输出: 123#
    的头像 发表于 01-07 15:26 1407次阅读