文档章节

MySQL怎样存储IP地址

五大三粗
 五大三粗
发布于 2015/05/21 21:48
字数 560
阅读 115
收藏 0

为什么要问如何存储IP

首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗?

其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。

 

利用函数算法处理

在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间。因为varchar是可变长形,需要多余的一个字节存储长度。另外int型在逻辑运算上要比varchar速度快。

 

IP转数字函数inet_aton()

我们转换下几个常用的IP地址

01 mysql> select inet_aton('255.255.255.255');
02 +------------------------------+
03 | inet_aton('255.255.255.255') |
04 +------------------------------+
05 |                   4294967295 |
06 +------------------------------+
07 1 row in set (0.00 sec)
08  
09 mysql> select inet_aton('192.168.1.1');   
10 +--------------------------+
11 | inet_aton('192.168.1.1') |
12 +--------------------------+
13 |               3232235777 |
14 +--------------------------+
15 1 row in set (0.00 sec)
16  
17 mysql> select inet_aton('10.10.10.10');
18 +--------------------------+
19 | inet_aton('10.10.10.10') |
20 +--------------------------+
21 |                168430090 |
22 +--------------------------+
23 1 row in set (0.00 sec)

所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思

 

数字转IP函数inet_ntoa()

01 mysql> select inet_ntoa(4294967295);
02 +-----------------------+
03 | inet_ntoa(4294967295) |
04 +-----------------------+
05 | 255.255.255.255       |
06 +-----------------------+
07 1 row in set (0.00 sec)
08  
09 mysql> select inet_ntoa(3232235777);
10 +-----------------------+
11 | inet_ntoa(3232235777) |
12 +-----------------------+
13 | 192.168.1.1           |
14 +-----------------------+
15 1 row in set (0.00 sec)
16  
17 mysql> select inet_ntoa(168430090);
18 +----------------------+
19 | inet_ntoa(168430090) |
20 +----------------------+
21 | 10.10.10.10          |
22 +----------------------+
23 1 row in set (0.00 sec)
24  
25 mysql> select inet_ntoa(0);       
26 +--------------+
27 | inet_ntoa(0) |
28 +--------------+
29 | 0.0.0.0      |
30 +--------------+
31 1 row in set (0.00 sec)

注意,0转换为 0.0.0.0

 

整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适(最小),最简单的数据类型。
inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

© 著作权归作者所有

共有 人打赏支持
五大三粗
粉丝 160
博文 2264
码字总数 4712446
作品 0
广州
程序员
私信 提问
利用mysql的inet_aton()和inet_ntoa()函数存储IP地址的方法分享

当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inetaton()和inetntoa()函数,来存储IP地址效率很高,适用unsigned int 就可以满足需求,不需要使用bigint,只需要4个字...

ning1022
2015/07/10
0
0
个推如何管理亿级代码的质量?持续集成SonarQube 代码质量管理系统

一个项目的成功与失败,系统的性能都很大程度的取决于项目的整体代码质量。尤其个推平台是一个极其复杂的分布式系统,整个系统包含了 RPC 调用,高速缓存,集群同步等各种复杂的场景。如果没...

个推
2015/10/19
587
0
在mysql中如何用int类型代替varchar类型存储IP 与 PHP的转换

1、首先我们应该先明白为什么要这样存储ip而用varchar直接存储IP呢? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以...

hansonwong
11/08
0
0
***学习笔记--场景篇--通过mysql的root账号来get shell

场景介绍: 今天的场景是前一周在内网*的时候遇到过的,找到一个mysql数据库弱口令。 账号和密码分别是root,也就是mysql中的dba。 这里其实权限很大了,首先mysql的root用户具有文件写权限,...

qq414207614
06/26
0
0
Mysql Cluster 7.6.4 环境搭建

MySQL Cluster 介绍 MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统。不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能。和Oracle Real Cluster Appli...

59090939
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JavaScript 继承使用解析

继承,通俗地说,之前你写过一些类,这些类中有一些是而你现在要写的类的功能的子集或者基本相同,那么你不用完全重新写一个新的类,你可以把之前写的类拿过来使用.这样的一种代码重用过程就叫做继...

前端攻城小牛
17分钟前
0
0
深入解析JavaScript 原型继承

JavaScript 原型继承,学习js面向对象的朋友可以看看。十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 Object.prototype JavaScript是...

前端攻城老湿
19分钟前
0
0
2018阿里云双12——年末钜惠,低至2折

活动链接地址:https://m.aliyun.com/act/team1212/?params=N.JlJCGqQNL4

城市之雾
20分钟前
0
0
VMware前路难测,多个厂家群雄逐鹿

导读 以VMware为例,虚拟机巨头公布了第二财季报告所示,它第二财季收入同比增长13%,达到了21.7亿美元,而且该公司收入和每股收益均超出预期。 在人们高谈Salesforce、亚马逊等新兴云计算厂...

问题终结者
21分钟前
0
0
Vuex的初探与实战小结

1.概述 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。 Vuex 和单纯的全局对象有以下两点不同: 1.Vuex 的状态存储是响...

peakedness丶
31分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部