您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2023-04-27 13:47:52  来源:微信公众号  作者:飞天小牛肉

提到 IP 地址(IPv4),大伙儿脑子里肯定马上能浮现类似于 192.168.0.1、127.0.0.1 这种常见的 IP 地址,然后结合这个问题 “MySQL 中用什么数据类型存 IP 地址?”,于是乎脱口而出用 char 字符串类型存。

面试官一脸冷漠,你顿时意识到情况不对,又仔细琢磨了一下。

然后发现,这个 IP 地址的长度是变化的,最短可以是 0.0.0.0 只需要 7 位,最长可以是 255.255.255.255 需要 15 位,于是自信地回答使用 varchar(15) 来存储 IP 地址,并为自己能够想到这一层而暗自窃喜。

谁知面试官竟轻蔑一笑,问你 “确定吗?”,你觉得这是面试官在考验你,于是坚定的回答 “确定”。

然后就开始了下一题

......

人们经常使用 varchar(15) 列来存储 IP 地址,但事实上这并不是最优解。

IP 地址的本质是 32 位无符号整数,类似于 192.168.0.1 这种点分十进制的字符串写法只是为了帮助人们理解和记忆,192.168.0.1 对应的十进制表示是 无符号整数 3232235521。

所以,说用字符串类型存 IP 地址的,其实是潜意识中以为 IP 地址是字符串,存的是点分十进制的字符串,但正确的应该是存 32 位的无符号整数

所谓有符号数其实就是将最高位作为符号位,比如 32 位的有符号 INT,最高位是符号位,剩下 31 位才是真实的数值,所以有符号 INT 的取值区间为:

无符号 INT 的取值区间为:

下表列出了 MySQL 出各个整数类型有符号和无符号的的取值范围,在定义表时,可以在数据类型后面添加关键字 UNSIGNED 来定义无符号整数,否则默认为有符号整数:

类型

有符号数取值范围

无符号数取值范围

TINYINT(1 字节,8 bit)

-128 〜 127

0 〜 255

SMALLINT(2 字节,16 bit)

-32768 〜 32767

0 〜 65535

MEDIUMINT(3 字节,24 bit)

-8388608 〜 8388607

0 〜 16777215

INT(4 字节,32 bit)

-2147483648 〜 2147483647

0 〜 4294967295

BIGINT(8 字节,64 bit)

-9223372036854775808 〜 9223372036854775807

0 〜 18446744073709551615

结合上表,可以看出,32 位的无符号  INT 正好可以容纳 IPv4 地址,下面是 INT UNSIGNED 和 VARCHAR(15) 两种数据类型的对比:

  1. 存储空间:4 字节的 INT 类型 15 字节的  VARCHAR(15) 更加节省存储空间。另外,VARCHAR 除了会保存需要的字符数,还会另加一个字节来记录长度(如果列声明的长度超过 255,则使用两个字节记录长度),所以 VARCHAR(15) 其实要占用 16 个字节。
  2. 检索速度:如果我们要在 IP 地址上建立索引,那么对于字符串索引来说,整数索引的检索速度简直就是降纬打击了,因为字符串类型的比较是需要从第一位字符开始遍历依次进行的,速度较慢。

MySQL 非常贴心地提供了 IPv4 地址点分十进制和无符号整数的相互转换函数,.NET_aton 和 inet_ntoa(底层是二进制移位操作,速度很快):

图片

当然你更应该在业务中去执行这些转换,减轻 MySQL 的压力。



Tags:数据类型   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Rust语言精讲:数据类型全解析
今天,我们将深入探讨Rust语言中的数据类型,这是理解和掌握Rust的基础。Rust语言数据类型概览Rust是静态类型语言,所有变量类型在编译时确定。Rust的数据类型分为两类:标量类型和...【详细内容】
2023-11-16  Search: 数据类型  点击:(123)  评论:(0)  加入收藏
深入了解Python数据类型及应用
Python提供了一组丰富的内置数据类型,使您能够在程序中处理不同类型的数据。核心数值类型包括整数、浮点数和复数。整数表示整数,对于精确的计数和计算非常有用。浮点数表示具...【详细内容】
2023-11-14  Search: 数据类型  点击:(337)  评论:(0)  加入收藏
使用 Java 枚举和自定义数据类型
介绍在 Java 编程领域,理解并有效利用枚举和自定义数据类型对于编写健壮、可维护且高效的代码至关重要。这篇文章旨在深入研究 Java 枚举和自定义数据类型的概念,提供见解和示...【详细内容】
2023-11-14  Search: 数据类型  点击:(275)  评论:(0)  加入收藏
Redis数据类型与应用场景
Redis介绍Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,常用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合...【详细内容】
2023-11-13  Search: 数据类型  点击:(308)  评论:(0)  加入收藏
十个Python中的数据类型技巧
简介如何在Python中操作数据类型。 数据类型是任何编程语言的基石,Python也不例外。通过有效地理解和使用数据类型,可以编写出更高效、可读性更强和更易于维护的代码。以下是...【详细内容】
2023-11-09  Search: 数据类型  点击:(267)  评论:(0)  加入收藏
Python数据类型:列表的魔法世界
列表是一种多用途的数据结构,用于存储和操作有序数据集合。本文将深入探索Python列表,包括定义、基本操作、常见方法、列表推导式、多维列表以及实际应用场景,助你充分利用这个...【详细内容】
2023-10-10  Search: 数据类型  点击:(253)  评论:(0)  加入收藏
详解Spring支持的各种数据类型的注入,你都用过哪些?
1 判断类型注入的属性判断其类型: Optional ObjectFactory ObjectProvider javax.inject.Providerpublic class DefaultListableBeanFactory extends AbstractAutowireCapabl...【详细内容】
2023-09-14  Search: 数据类型  点击:(265)  评论:(0)  加入收藏
揭秘Redis五大数据类型及超实用应用场景!
大家好,我是你们的小米!今天我们要来聊聊一个在面试中经常被问到的话题:Redis的五种数据类型及其应用场景。作为一名热爱技术的小伙伴,对于这个话题,我们可是要深入挖掘一下哦!Str...【详细内容】
2023-08-28  Search: 数据类型  点击:(326)  评论:(0)  加入收藏
Redis高级数据类型:BitMap
导语在Redis中,BitMap(位图)是一种非常强大的高级数据类型,用于存储和处理大量布尔值信息。通过使用BitMap,您可以在节省内存的同时高效地执行各种位操作,如位的设置、清除、翻转...【详细内容】
2023-08-18  Search: 数据类型  点击:(190)  评论:(0)  加入收藏
mysql安装与配置及四大引擎和数据类型、建表以及约束、增删改查、常用函数、聚合函数以及合并
一、MySQL安装与配置1、MySQL简介why 数据在内存中容易丢失 数据在文件中,不便于操作what 使用完整的管理系统统一管理,易于查询where 凡是需要...【详细内容】
2023-08-14  Search: 数据类型  点击:(138)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条