关于MySQL存储IP地址引发的思考

产生思考        

今天在看《高性能MySQL》时,有这么一句话,IP地址实际上是32位无符号整数,所以应该用无符号整数存储IP地址,MySQL提供了INET_ATON()和INET_NTOA()函数在这两种表示方法之间的转换。这样存的好处有两点:

用法如下

  • 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>
发布了200 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/why444216978/article/details/103569571
今日推荐