Mysql存储IP使用什么字段类型? int要比varchar好??

简介: Mysql存储IP使用什么字段类型? int要比varchar好??

答案:存储IP使用无符号整数(UNSIGNED INT)要好于字符串(VARCHAR)

高性能MySQL第3版(4.1.7节)书中,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。 但是没有给出具体原因。


为了搞清楚这个原因,查了一些资料,记录下来。


相对字符串存储,使用无符号整数来存储有如下的好处:



通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)即可。


MySQL在保存变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节即可。


另外还可以使用4个字段分别存储IPv4中的各部分,但是通常这不管是存储空间和查询效率应该都不是很高(可能有的场景适合使用这种方式存储)。


使用字符串和无符号整数来存储IP的具体性能分析及benchmark,可以看这篇文章。


https://bafford.com/2009/03/09/mysql-performance-benefits-of-storing-integer-ip-addresses/


使用无符号整数来存储也有缺点:


  • 不便于阅读
  • 需要手动转换


对于转换来说,MySQL提供了相应的函数来把字符串格式的IP转换成整数INET_ATON,以及把整数格式的IP转换成字符串的INET_NTOA


如下所示:


mysql> select inet_aton('192.168.0.1');

+--------------------------+

| inet_aton('192.168.0.1') |

+--------------------------+

|               3232235521 |

+--------------------------+

1 row in set (0.00 sec)


mysql> select inet_ntoa(3232235521);

+-----------------------+

| inet_ntoa(3232235521) |

+-----------------------+

| 192.168.0.1           |

+-----------------------+

1 row in set (0.00 sec)


对于IPv6来说,使用VARBINARY同样可获得相同的好处,同时MySQL也提供了相应的转换函数,即INET6_ATONINET6_NTOA


对于转换字符串IPv4和数值类型,可以放在应用层,下面是使用java代码来对二者转换


packagecom.mikan;
/*** @author Mikan*/publicclassIpLongUtils {
/*** 把字符串IP转换成long** @param ipStr 字符串IP* @return IP对应的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值转换成字符串** @param ipLong IP的long值* @return long值对应的字符串*/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

更多java技术、java面试、互联网技术、娱乐技术请关注下面公众号:

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
354 3
|
7月前
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
10月前
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
2169 4
|
存储 关系型数据库 MySQL
MySQL 字段类型探究:深入理解 Varchar(50) 与 Varchar(500)
在MySQL数据库中,`VARCHAR`类型是一种常用的字符串存储类型,它允许定义一个可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储和性能方面也有显著的区别。本文将深入探讨这两种字段类型的区别,以及它们在实际应用中的选择。
500 3
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
471 2
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
396 2
|
存储 SQL 关系型数据库
MySQL 存储函数及调用
MySQL 存储函数及调用
705 3
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
196 0

推荐镜像

更多