产生思考
今天在看《高性能MySQL》时,有这么一句话,IP地址实际上是32位无符号整数,所以应该用无符号整数存储IP地址,MySQL提供了INET_ATON()和INET_NTOA()函数在这两种表示方法之间的转换。这样存的好处有两点:
- 节省空间,32位无符号整数,即INT类型(不清楚MySQL各种类型的点这里移步),只占4个字节。
- 通过where比较,可以方便筛选某个地址段的IP
用法如下
- INET_ATON(192.168.1.1) = 3232235777
- INET_NTOA(3232235777 ) = 192.168.1.1
转换原理
那么有没有考虑过是如何实现转换的呢?其实很简单,我们上边说了,IP地址每个地址段的范围为0~255,也就是0~2的8次方-1,所以说每个地址段占8位1个字节的大小。所以IP转整型,就是从高地址段到低地址段进行计算,公式如下:
第一段*256的3次方 + 第二段*256的2次方+第三段*256+第四段*1
= 192*256*256*256 + 168*256*256 + 1*256 + 1*1
= 3221225472 + 11010048 + 256 + 1
= 3232235777
MySQL验证结果
mysql> select INET_ATON('192.168.1.1');
+--------------------------+
| INET_ATON('192.168.1.1') |
+--------------------------+
| 3232235777 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa(3232235777);
+-----------------------+
| inet_ntoa(3232235777) |
+-----------------------+
| 192.168.1.1 |
+-----------------------+
1 row in set (0.00 sec)
mysql>