Home > Database > Mysql Tutorial > body text

在mysql中用int类型存储IP

WBOY
Release: 2016-06-07 16:32:07
Original
918 people have browsed it

这篇文章没什么技术含量, 主要介绍两个mysql函数, INET_ATON() 将IP转为十进制数字, INET_NTOA()将数字转换为IP。 先来看IP的结构, 127.0.0.1 ,学计算机的对2的N次方比较敏感,一看就猜到是由 4个8位的二进制数字组成, 对, 就是这样!也就是说IP转

    这篇文章没什么技术含量, 主要介绍两个mysql函数,  INET_ATON() 将IP转为十进制数字, INET_NTOA()将数字转换为IP。

    先来看IP的结构, 127.0.0.1  ,学计算机的对2的N次方比较敏感,一看就猜到是由 4个8位的二进制数字组成, 对, 就是这样!也就是说IP转换成二进制可以这样: 

select concat(bin(127),lpad(bin(0),8,0),lpad(bin(0),8,0),lpad(bin(1),8,0));
Copy after login

    把每一位的前边补0, 然后拼接起来,得到这样的结果: 1111111000000000000000000000001 

    系统的INET_ATON()函数也是这么算的,不信可以对比一下结果:

select bin(inet_aton('127.0.0.1'));
Copy after login

    得到的结果也是这样:  1111111000000000000000000000001 

    所以得出结论: INET_ATON() 就是把IP的每一段转为二进制拼接起来,然后将这个32位的二进制数字转为10进制

示例:

select INET_ATON('127.0.0.1');  --转为数字
select INET_NTOA(2130706433); --转为IP
Copy after login

    为什么这么存储呢? 

    有人说节省空间, 也对, 不过比较蛋疼, 现在的硬盘那么便宜在乎这点空间? 

    更为合理的解释是, 方便查询, 比如要查某一网段的所有IP就可以 :

select * from table where ip between inet_aton('192.168.0.1') and inet_aton('192.168.0.255');
Copy after login

声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权

转载请注明来源:小景的博客

本文链接地址:http://www.phpv5.com/blog/archives/313/

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template