在MySQL中如何存储一个IPv4地址?

在MySQL如何存储IPv4地址?这个在秋招面试的过程中被问到过,没有答上来,今天猛地想起了这个问题,做一下复盘。

一个IPv4地址是由32位二进制来表示的,用点分十进制表示可以划分为4部分,每部分占8位,例如192.168.1.8

基本上有两种方案:

  • 直接使用char来存储固定的字符串
  • 将ip地址转换为整型

存储为整型

每个ip地址二进制表示都是唯一的且都是非负数,因此我们可以将一个ip地址转换为一个无符号整型。

为什么是无符号整型?
在MySQL中,一个int是32位,但是int是有符号的,因此表示完整一个ipv4地址。
而unsigned int是32位且没有负数,因此刚好可以完整表示一个ipv4地址。
而使用64位整型就造成了浪费。

192.168.1.8为例,说一下具体的思路:
在存入时,需要将ipv4转换为整数:

  1. 我们接受到的ipv4的参数肯定是一个字符串,我们按照点分割成四部分:19216818
  2. 对于第一部分192,我们左移24位,第二部分168左移16位,第三部分1左移8位,第四部分8不动
  3. 将这四部分直接相加,就得到了最终要存储的值,然后将这个值传给MySQL进行存储就可以了

在取出时,需要将整数转换为ipv4的字符串:

  1. 对于这个整数,取后8位,就得到了8
  2. 然后将整数右移8位,继续取后8位,就得到了1,以此类推
    同理,左移取前8位也是可以的。

在MySQL中的支持

对于将ipv4转换为整数,以及将整数转换为ipv4,在MySQL中是有两个函数的,我们可以直接使用:

  • INET_ATON() 函数将IPv4地址转换为一个无符号整数。它接受一个点分十进制的IPv4地址,返回对应的整数值。
  • INET_NTOA() 函数则将整数形式的IPv4地址转换回点分十进制表示法

总结

ipv4直接存储为字符串
优点是:易读、灵活
缺点:占用更多的空间

ipv4转换为整数:
优点:节省空间、便于比较
缺点:不易读、需要额外的运算

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值