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

    文章

    4346

    浏览量

    86052
  • IP
    IP
    +关注

    关注

    5

    文章

    1715

    浏览量

    149798
  • 字符串
    +关注

    关注

    1

    文章

    585

    浏览量

    20575
  • MySQL
    +关注

    关注

    1

    文章

    826

    浏览量

    26666

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    字符串字符数组的区别

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

    字符串反转的实现方式

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

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

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

    base64字符串转换为二进制文件

    Base64是一种编码方法,用于将二进制数据转换为ASCII字符串。这种编码通常用于在不支持二进制数据的系统中传输数据,例如电子邮件或网页。将Base64字符串转换为二进制文件的过程相对简单,但需要
    的头像 发表于 11-10 10:55 1577次阅读

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

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

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

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

    labview中如何实现字符串换行

    2.1 使用内置函数 LabVIEW提供了多种内置函数来处理字符串,包括换行。以下是一些常用的方法: 使用 Build Array 函数 :通过循环构建字符串数组,每个元素代表一行
    的头像 发表于 09-04 15:47 1946次阅读

    labview中常用的字符串函数有哪些?

    在LabVIEW中,常用的字符串函数广泛覆盖了对字符串的各种操作,包括但不限于格式化、搜索、替换、连接、计算长度等。以下是一些常用的字符串函数及其简要说明: 字符串长度(String
    的头像 发表于 09-04 15:43 926次阅读

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

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

    如何向ESP8266发送字符串

    我们正在开发一个应用程序,其中需要通过 Internet 将字符串字符(例如“1x,7juyss”)从移动设备发送到ESP8266。我们已经阅读了 Cloud API 文档,但没有提到传递字符串参数。此外,Data Stream
    发表于 07-15 06:58

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

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

    鸿蒙TypeScript学习第10天:【String(字符串)】

    String 对象用于处理文本(字符串)。
    的头像 发表于 04-08 14:32 869次阅读
    鸿蒙TypeScript学习第10天:【String(<b class='flag-5'>字符串</b>)】

    C语言字符串编译函数介绍

    在C语言中,字符串实际上是使用null字符O'终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串
    的头像 发表于 03-07 16:18 534次阅读
    C语言<b class='flag-5'>字符串</b>编译函数介绍