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

在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。但是没有给出具体原因。为了搞清楚这个原因,查了一些资料,记录下来。

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

节省空间,不管是数据存储空间,还是索引存储空间 便于使用范围查询(BETWEEN...AND),且效率更高 通常,在保存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_ATON和INET6_NTOA。

对于转换字符串IPv4和数值类型,可以放在应用层

下面是使用java代码来对二者转换:

package com.mikan;/*** @author Mikan*/
public class IpLongUtils {/*** 把字符串IP转换成long** @param ipStr 字符串IP* @return IP对应的long值*/public static long ip2Long(String ipStr) {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值对应的字符串*/public static String long2Ip(long ipLong) {StringBuilder ip = new StringBuilder();ip.append(ipLong >>> 24).append(".");ip.append((ipLong >>> 16) & 0xFF).append(".");ip.append((ipLong >>> 8) & 0xFF).append(".");ip.append(ipLong & 0xFF);return ip.toString();}public static void main(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软 .NET Core 3.1 年底将结束支持,请升级到.NET 6

微软近日宣布&#xff0c;将于 2022 年 12 月 13 日停止为 .NET Core 3.1 提供服务更新、安全修复和技术支持。.NET Core 是一个免费开源的、用于 Windows、Linux 和 macOS 操作系统的软件框架。该项目主要由微软员工通过 .NET 基金会开发&#xff0c;并在 MIT 许可下发布。202…

软件团队的模式选择

软件团队的模式分为&#xff1a;主治医生模式、明星模式、社区模式、业余剧团模式、秘密团队、特工团队、交响乐团模式、爵士乐模式、功能团队模式和官僚模式。 经过小组的讨论&#xff0c;我们决定选用交响乐团模式获得功能团队模式。 交响乐团模式的优点是种类多&#xff0c;…

Angular 2

1. Angular2 官网 https://angular.io/guide/quickstart Node.js 下载 https://nodejs.org/en/ 怎么在vs code中使用angualr2 https://code.visualstudio.com/docs/nodejs/angular-tutorial moment.js:(javacript日期处理库) http://momentjs.cn/ 2. ng2-hightCharts https://…

「Docker入门指北」容器很难理解?带你从头到尾捋一遍

文章目录 1. 初始虚拟化 &#x1f351; 虚拟化概念&#x1f351; 硬件虚拟化2. Docker容器 &#x1f351; Docker技术的诞生&#x1f351; 容器与虚拟化&#x1f351; 性能差别&#x1f351; Docker优势 编排有序高效易迁移快速部署3. 容器生态系统 &#x1f351; 核心技术 容器…

微服务:事务管理

几乎所有的信息管理系统都会涉及到事务&#xff0c;事务的目的是为了保证数据的一致性&#xff0c;这里说的一致性是数据库状态的一致性。说到数据库状态的一致性&#xff0c;相信大家都会想到 ACID &#xff1a;原子性&#xff08;Atomic&#xff09;&#xff1a;在一个事件的…

js - flex布局测试案例:完美居中

<span>I love flex layout!</span><style>body{display:flex;justify-content:center;align-items:center;font-size:3em;color:#00ffff;}</style>![enter image description here][1]<p>与自己为敌&#xff0c;</p><p>与自己为友&a…

操作数据库(对战小游戏)

创建数据库 1 create database duizhan2 go3 use duizhan4 go5 create table duizhan6 (7 Code varchar(20) not null primary key,8 Name varchar(20) not null,9 Sex varchar(20) not null, 10 Blood int, 11 Attack int, 12 Defence int, 13 Mingzhong…

8-Python3从入门到实战—基础之数据类型(集合-Sets)

Python从入门到实战系列——目录 集合的定义 集合&#xff08;set&#xff09;和字典类似&#xff0c;也是一组key的集合&#xff0c;但不存储value&#xff1b;由于key不能重复&#xff0c;所以&#xff0c;在set中&#xff0c;没有重复的key。创建一个set&#xff0c;需要提供…

Redis的那些事:一文入门Redis的基础操作

Redis是什么Redis&#xff0c;全称是Remote Dictionary Service,翻译过来就是&#xff0c;远程字典服务。redis属于nosql非关系型数据库。Nosql常见的数据关系&#xff0c;基本上是以key-value键值对形式存在的。Key-value: 就像翻阅中文字典或者单词字典&#xff0c;通过指定的…

10种提问型爆文标题句式 直接套用

如果你用1天的时间来写篇好文章&#xff0c;那你花掉半天时间想一个好标题都不过分&#xff01; 你是不是觉得我有点言过其实了&#xff1f;没关系&#xff0c;先来问你2个问题&#xff1a; 1、花了很长时间&#xff0c;写了一篇很牛的卖货推文&#xff0c;定稿后&#xff0c…

同域和不同域长啥样

相同域http://www.jiangdou.com/http://www.jiangdou.com/maidou 不同域http://www.jiangdou.comhttp://bbs.jiangdou.comhttps://www.jiangdou.comhttp://www.jiangdou.com:8080转载于:https://www.cnblogs.com/MaiJiangDou/p/6689133.html

2016 China Joy抢先看,文末有彩蛋!

这里只有你想不到的&#xff0c;没有你看不到的。 2016 China Joy开幕在即&#xff0c;天气成了最折磨各种媒体、展商和观众的小妖精&#xff0c;一会艳阳天&#xff0c;一会大暴雨&#xff0c;轩轩现在是这样的&#xff01; 七月底的魔都&#xff0c;热的那叫一个销魂&#x…

JdbcTemplate+PageImpl实现多表分页查询

一、基础实体  MappedSuperclass public abstract class AbsIdEntity implements Serializable {private static final long serialVersionUID 7988377299341530426L;public final static int IS_DELETE_YES 1;// 标记删除public final static int IS_DELETE_NO 0;// 未删除…

消息队列选型手册

前言 消息队列中间件重要吗&#xff1f;面试必问问题之一&#xff0c;你说重不重要。我有时会问同事&#xff0c;为啥你用 RabbitMQ&#xff0c;不用 Kafka&#xff0c;或者 RocketMQ 呢&#xff1f; 他给我的回答&#xff1a;“因为公司用的就是这个&#xff0c;大家都这么用…

Jenkins 持续集成国产嵌入式操作系统 RT-Thread 的CI

我们直接在Jenkins的镜像基础上进行集成RT-Thread 的编译环境&#xff0c; 这样直接使用Shell 命令 最直接了当&#xff0c; 通过 第三方docker等插件&#xff0c; 尝试了计重方案&#xff0c; 没有找到理想中的感觉&#xff0c; 如果其他人有想法可以告知一二。 我们有现成的镜…

codevs原创抄袭题 5960 信使

题目描述 Description•战争时期&#xff0c;前线有n个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。指挥部设在第一个哨所。当指挥部下达…

VC解析XML--使用CMarkup类解析XML

经过今天尝试MFC解析XML串&#xff0c;也算有了不少收获&#xff0c;总结一下。 我是使用的CMarkup类对XML进行操作。 CMarkup好象都是先从一个xml文件里面把内容读出来&#xff0c;再进行解析&#xff0c;搞得我恨不得要把我的CString写到xml文件里面…

MongoDB精华总结

概述 MongoDB是属于文档型的NoSQL数据库&#xff0c;也就是文档数据库。文档数据库区别于传统的其它数据库&#xff0c;它是用来管理文档。在传统的数据库中&#xff0c;信息被分割成离散的数据段&#xff0c;而在文档数据库中&#xff0c;文档是处理信息的基本单位&#xff0c…

认清性能问题

本文翻译自 Thinking Clearly About Performance 这是我三年前读到的一篇关于性能问题的好文&#xff0c;读完后还觉不过瘾&#xff0c;怕理解的不够遂又翻译了一遍&#xff0c;这也是当年我的第一次翻译。 这几年来每次碰到性能问题&#xff0c;我都会想起这篇文章&#xff0c…

字节也开始缩招了...

阅读本文大概需要6分钟。最近和一个字节技术总监聊天&#xff0c;得知他们公司居然也开始缩招了。这真让人感到意外&#xff0c;毕竟头条这些年是以极速扩张而闻名。搜了搜新闻还真是&#xff0c;这也意味着互联网行业最后一个坚挺的大户也在开源节流了。最近互联网行业的情况真…