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编程精选】欢迎添加关注!文章转载请注明出处。

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

    关注

    12

    文章

    3854

    浏览量

    84652
  • IP
    IP
    +关注

    关注

    5

    文章

    1403

    浏览量

    148268
  • 字符串
    +关注

    关注

    1

    文章

    550

    浏览量

    20105
  • MySQL
    +关注

    关注

    1

    文章

    775

    浏览量

    25999

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

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

收藏 人收藏

    评论

    相关推荐

    如何提取串口接收字符串数组里的某个字符串

    前几天搞了好久串口发送接收字符串的程序代码,终于搞出来了。还没高兴多久,新的问题又来了。我使用STM8S105K4的UART2口跟蓝牙模块通信的,我发送字符串指令给蓝牙后,蓝牙返回来了十几
    发表于 04-22 06:05

    USB字符串描述符里面的序列号字符串到底是什么东西?

    在设备描述符里面,有一个表示序列号字符串描述符的编号,请问这个序列号字符串的描述符是什么东西呢? 厂商字符串和设备字符串都能理解,而且在电脑的“设备与打印机”里面都找到了。但请问这个
    发表于 01-24 08:06

    labview扫描字符串怎么用

    介绍如何在 LabVIEW 中使用扫描字符串以及相关的技巧和注意事项。 字符串是 LabVIEW 中的一种基本数据类型,表示一系列字符的序列。扫描字符串是指从一个给定的
    的头像 发表于 12-29 10:12 597次阅读

    labview扫描字符串怎么用

    LabVIEW是一种图形化编程语言,用于开发控制、测量和监控系统。虽然它主要用于工程和科学领域,但也可以用于处理文本和字符串。 在LabVIEW中,可以使用字符串处理函数来扫描字符串
    的头像 发表于 12-26 16:58 694次阅读

    labview中怎么对字符串中的进行实时处理

    字符串操作函数: LabVIEW提供了许多函数来字符串进行操作。这些函数包括查找、替换、插入、删除和连接等。使用这些函数,您可以实时修改字符串的内容。例如,您可以使用"
    的头像 发表于 12-26 14:12 542次阅读

    s7-200字符串赋值指令

    S7-200中的字符串赋值指令,包括其语法、使用方法、注意事项等,以帮助读者更好地理解和应用该指令。 首先,我们来了解一下S7-200中字符串的表示方式。字符串是由多个字符组成的序列,
    的头像 发表于 12-08 14:44 927次阅读

    oracle中拼接字符串函数

    在Oracle中,我们可以使用 CONCAT 函数来拼接字符串。CONCAT 函数接受两个参数,它将这两个参数连接起来并返回相应的字符串结果。 语法示例: CONCAT(string1
    的头像 发表于 12-06 09:49 924次阅读

    java switch case 能不能用字符串

    Java的switch语句在处理字符串方面有一些限制。在Java 7之前,switch语句只能处理整数类型的表达式,如int或char。但从Java 7开始,Java引入了对字符串的支持。然而,这种
    的头像 发表于 11-30 14:46 604次阅读

    c语言怎么用scanf输入字符串

    , %s!n" , name); return 0 ;} 在上面的代码中,我们定义了一个大小为20的字符数组来存储输入的字符串。然后,我们使用scanf函数来接收用户输入的
    的头像 发表于 11-24 10:03 1043次阅读

    c语言字符串定义

    字符串的定义、初始化、操作和常见问题。 字符串的定义和初始化 在C语言中,字符串被定义为一个字符数组。可以通过两种方式来定义和初始化字符串
    的头像 发表于 11-24 10:02 846次阅读

    python输出固定长度的字符串

    Python 是一种强大而灵活的编程语言,具有许多用于处理字符串的功能。在 Python 中,有多种方法可以输出固定长度的字符串。下面将详细介绍这些方法。 方法一:使用字符串拼接 在 Python
    的头像 发表于 11-22 10:41 1203次阅读

    oracle怎么把clob字段转换为字符串

    将CLOB字段转换为字符串,可以使用PL/SQL中的DBMS_LOB包提供的函数来实现。 在Oracle数据库中,CLOB(Character Large Object)是用于存储大量字符
    的头像 发表于 11-21 10:32 3916次阅读

    mysql字符串包含某个字符串

    MySQL是一种开源的关系型数据库管理系统,被广泛用于构建Web应用程序和其他大型数据驱动的应用。在进行MySQL数据库查询时,经常需要使用字符串包含操作,即判断一个字符串是否包含另一个字符串。本文
    的头像 发表于 11-16 14:52 1109次阅读

    C++字符串string

    string是C++编程语言中的字符串。在C++中字符串处理可以使用c语言字符串形式char *,也可以使用string类格式。
    的头像 发表于 07-10 00:26 884次阅读
    C++<b class='flag-5'>字符串</b>string

    如何使用Labview2016利用字符串输入控件和按钮实现一个化学式的编辑器(完成上标和下标的输入)

    字体且限制文本在第二行做正常文本。 尝试的办法二: (1)还是从改变字体的大小去下手,使用字符串的属性节点去改变字体大小,但是目前还只能是静态的,无法实现动态实时输入改变大小; (2)只能改变
    发表于 05-28 18:21