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

    文章

    4245

    浏览量

    85622
  • IP
    IP
    +关注

    关注

    5

    文章

    1632

    浏览量

    149298
  • 字符串
    +关注

    关注

    1

    文章

    576

    浏览量

    20476
  • MySQL
    +关注

    关注

    1

    文章

    799

    浏览量

    26413

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

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

收藏 人收藏

    评论

    相关推荐

    labview字符串数组转化为数值数组

    常重要的。LabVIEW支持多种数据类型,包括数值、字符串、数组、簇等。在本例中,我们将关注字符串数组和数值数组。 字符串数组 :由一系列字符串组成的数组,每个元素都是一个
    的头像 发表于 09-04 17:47 1636次阅读

    labview字符串如何转换为16进制字符串

    在LabVIEW中,将字符串转换为16进制字符串是一个常见的需求,尤其是在处理数据通信和硬件接口时。LabVIEW提供了多种方法来实现这一转换,包括使用内置函数、编写VI(Virtual
    的头像 发表于 09-04 15:54 1692次阅读

    labview字符串的四种表示各有什么特点

    。在LabVIEW中,字符串是一种基本的数据类型,用于表示文本信息。字符串在LabVIEW中有多种表示方式,每种方式都有其特定的应用场景和特点。以下是对LabVIEW中四种字符串表示方式的分析
    的头像 发表于 09-04 15:40 393次阅读

    锐评Ruby 3.4.0 默认启用字符串字面量冻结功能

    据悉,Ruby自2.3版起引入了“冻结”机制,通过使用frozen_string_literal: true魔法注释,可令文件内所有字符串字面量默认为冻结状态,防止开发过程中无意修改字符串,提高代码稳定性与性能,降低内存占用。
    的头像 发表于 05-17 15:44 320次阅读

    labview扫描字符串怎么用

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

    labview扫描字符串怎么用

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

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

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

    oracle字符串split成多个

    Oracle是一种广泛使用的关系型数据库管理系统,它提供了许多强大的功能和函数,用于处理和操作数据。其中之一就是字符串分割(split)方法,该方法用于将一个字符串按照指定的分隔符分割成多个子字符串
    的头像 发表于 12-06 09:54 5068次阅读

    oracle中拼接字符串函数

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

    java switch case 能不能用字符串

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

    MySQL替换字符串函数REPLACE

    MySQL是目前非常流行的开源数据库管理系统之一,它具有强大的功能和性能。其中之一的字符串函数REPLACE,可以用于替换字符串中的指定字符字符串
    的头像 发表于 11-30 10:44 1462次阅读

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

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

    c语言字符串定义

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

    python输出固定长度的字符串

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

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

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