>  기사  >  데이터 베이스  >  在mysql中用int类型存储IP

在mysql中用int类型存储IP

WBOY
WBOY원래의
2016-06-07 16:32:07859검색

这篇文章没什么技术含量, 主要介绍两个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));

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

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

select bin(inet_aton('127.0.0.1'));

    得到的结果也是这样:  1111111000000000000000000000001 

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

示例:

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

    为什么这么存储呢? 

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

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

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

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

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

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.