IP 地址推荐用int,还是varchar存储?

MySQL关系型数据库数据库

大家好,我是苏三。

数据库保存 IP 地址是偶尔会遇到的存储场景,今天来聊一聊数据库怎样保存 IP 地址。

PostgreSQL

PostgreSQL 使用 INET 类型存储 IP 地址,IPv4 或 IPv6 都可以存储,同时也可以存储子网信息。

存储格式为 IP/子网掩码位数,比如:192.168.1.1/24。插入 SQL 如下:

  
INSERT INTO ip\_test(id, ip) VALUES (1, '192.168.1.1/24');  

INET 类型可以对 IP 地址进行输入校验、子网包含判断等操作,提升数据完整性和查询效率。比如下面语句判断子网是否包含,结果返回 true:

  
SELECT '192.168.1.5'::inet << '192.168.1.0/24'::inet;  

MySQL

MySQL 可以使用 VARCHAR 类型保存 IP 地址,但是并不推荐,因为 MySQL 提供了专门的保存 IP 地址的数据类型。

IPV4

MySQL 推荐使用 INT UNSIGNED 类型保存 IPV4 地址,并且提供了专门的函数 INET_ATON(将 IP 转为整数)和 INET_NTOA(将整数转为 IP) 进行转换。首先我们创建一张表:

  
CREATE TABLE`ip\_test` (  
`id`bigint(20) NOTNULL AUTO\_INCREMENT,  
`ip`int(10) unsignedDEFAULTNULL,  
KEY`id` (`id`)  
) ENGINE=InnoDB AUTO\_INCREMENT=2DEFAULTCHARSET=utf8 COLLATE=utf8\_bin  

下面 SQL 是插入和查询的实例:

  
--插入  
INSERT INTO ip\_test VALUES(1,INET\_ATON('192.168.1.5'));  
--查询  
SELECT  id, INET\_NTOA(ip) FROM ip\_test;  

使用 INT UNSIGNED 类型保存 IPV4 地址,有如下好处:

  • 存储空间更小,仅 4 个字节;
  • 支持范围查询和索引优化,查询性能更好。

IPv6

对于 IPv6 类型地址,MySQL 可以使用 VARBINARY(16) 类型存储,并且提供了 INET6_ATON 和 INET6_NTOA 函数进行转换。我们再创建一张保存 IPV6 地址的表:

  
CREATE TABLE `ip\_test\_v6` (  
  `id` bigint(20) NOT NULL AUTO\_INCREMENT,  
  `ip` varbinary(16) DEFAULT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8\_bin  

下面 SQL 是插入和查询的实例:

  
--插入  
INSERT INTO ip\_test\_v6 (id,ip) VALUES (1, INET6\_ATON('FC00:0:130F:0:0:9C0:876A:130B'));  
--查询  
SELECT id, INET6\_NTOA(ip) FROM ip\_test\_v6;  

总结

主流数据库一般不推荐直接使用 VARCHAR 类型来存储 IP 地址,而是提供了内置的类型和函数,存储和查询效率更高。

最后欢迎加入苏三的星球,你将获得:智能天气播报AI Agent、SaaS点餐系统(DDD+多租户)、100万QPS短链系统(超过并发)、复杂的商城微服务系统(分布式)、苏三商城系统、苏三AI项目、刷题吧小程序、秒杀系统、码猿简历网站、代码生成工具等10个项目的源代码、开发教程和技术答疑。 系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。

还有1V1免费修改简历、技术答疑、职业规划、送书活动、技术交流。

扫描下方二维码,可以加入星球:

picture.image

数量有限,先到先得。 目前星球已经更新了6100+篇优质内容,还在持续爆肝中.....

星球已经被官方推荐了3次,收到了小伙伴们的一致好评。戳我加入学习,已有2100+小伙伴加入学习

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生数据库 veDB 核心技术剖析与展望
veDB 是一款分布式数据库,采用了云原生计算存储分离架构。本次演讲将为大家介绍火山引擎这款云原生数据库的核心技术原理,并对未来进行展望。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论