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

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

3天内不再提示

MySQL中用什么数据类型存IP地址

jf_ro2CN3Fa 来源:飞天小牛肉 2023-08-25 14:39 次阅读

来源:飞天小牛肉

提到 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) 两种数据类型的对比:

存储空间:4 字节的 INT 类型 15 字节的 VARCHAR(15) 更加节省存储空间。另外,VARCHAR 除了会保存需要的字符数,还会另加一个字节来记录长度(如果列声明的长度超过 255,则使用两个字节记录长度),所以 VARCHAR(15) 其实要占用 16 个字节。

检索速度:如果我们要在 IP 地址上建立索引,那么对于字符串索引来说,整数索引的检索速度简直就是降纬打击了,因为字符串类型的比较是需要从第一位字符开始遍历依次进行的,速度较慢。

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

afe138ae-4309-11ee-a2ef-92fbcf53809c.png

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

审核编辑:汤梓红

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

    关注

    0

    文章

    240

    浏览量

    16743
  • IPv4
    +关注

    关注

    0

    文章

    131

    浏览量

    19689
  • 数据类型
    +关注

    关注

    0

    文章

    228

    浏览量

    13499
  • mysql架构
    +关注

    关注

    0

    文章

    2

    浏览量

    643

原文标题:我懵了,如果要存 IP 地址,用什么数据类型比较好?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    GaussDB 数据类型介绍

    GaussDB 数据库 GaussDB 是华为基于 openGauss 自研生态推出的云化企业级分布式关系型数据库,它支持多种数据类型,包括数值、字符、日期等。在使用 GaussDB 时,可能需要
    的头像 发表于 06-05 16:40 1279次阅读
    GaussDB <b class='flag-5'>数据类型</b>介绍

    变量的数据类型类型输入连线的数据类型不兼容。

    请问这个vi错在哪里?变量的数据类型类型输入的是一样的啊运行次序是会计贴士.vi在“支出情况”中点击“保存”数据库是MySQL@宗师级钓鱼大师 @zhihuizhou @格式呐伤 @
    发表于 09-01 11:02

    照着别人的程序做了一遍,变量的数据类型和输入类型不符

    @zhihuizhou主vi是会计贴士vi在获取收入记录.vi和获取支出记录vi中 有错误变量的数据类型类型输入连线的数据类型不兼容。本来用的数据库是
    发表于 09-03 14:46

    MySQL字符类型

    MySQL数据类型之字符串(string)
    发表于 06-14 11:58

    mysql是根据哪些原则来进行数据类型选择的?

    mysql应该根据那些原则来进行数据类型的选择!
    发表于 07-23 06:32

    vhdl数据类型

    VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。VHDL中的数据类型可以分成四大类: 标量型(SCALAR TYPE):属单元素的最基本的数据类型,通常用于描述一个单值数据对象
    发表于 03-30 15:59 11次下载

    MySQL支持的三种数据类型

    MySQL支持所有标准SQL数字数据类型。这些类型包括整数类型、定点类型、浮点类型和位置
    的头像 发表于 05-03 17:33 3220次阅读
    <b class='flag-5'>MySQL</b>支持的三种<b class='flag-5'>数据类型</b>

    MySQL为字段选择合适数据类型

    在使用MySQL创建数据表时,经常会遇到如何为字段选择合适的数据类型的问题,接下来我们一起分析字符串、数值、日期数据类型的选择。
    的头像 发表于 05-03 17:38 2607次阅读
    <b class='flag-5'>MySQL</b>为字段选择合适<b class='flag-5'>数据类型</b>

    Struct结构数据类型

    Struct类型是一种由多个不同数据类型元素组成的数据结构,其元素可以是基本数据类型,也可以是Struct、数组等复杂数据类型以及PLC
    的头像 发表于 07-25 17:02 2442次阅读

    MySQL中如何存储IP地址

    在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。 但是没有给出具体原
    的头像 发表于 08-11 11:02 763次阅读

    什么是数据类型转换

    常用的3种数据类型:1、Python数据类型第一种:字符串(str)。 2、Python数据类型第二种:整数(int)。 3、Python数据类型第三种:浮点数(float)。
    的头像 发表于 02-23 15:21 583次阅读

    定义数据类型

    在运算之前我们必须首先定义出数据类型,定义出脚本支持的数据类型,这是运算的基础。 这一小节我们将定义出数据类型,在这里我们暂时定义四个数据类型:
    的头像 发表于 03-03 10:10 633次阅读

    PLC数据类型的种类 常见的转换方法

      PLC数据类型是指编程软件中用来表示变量、常量、对象等数据类型。不同的PLC软件可能会支持不同的数据类型,但常见的PLC
    发表于 03-17 17:41 2.3w次阅读

    Redis的数据类型有哪些

    Redis的数据类型有哪些?有五种常用数据类型:String、Hash、Set、List、SortedSet。以及三种特殊的数据类型:Bitmap、HyperLogLog、Geospatial
    的头像 发表于 10-09 10:51 410次阅读

    MySQL数据库的url地址

    (Protocol):MySQL数据库使用的协议通常是MySQL自定义的协议,它使用TCP/IP协议在客户端和服务器之间进行通信。在URL地址
    的头像 发表于 12-06 10:58 994次阅读