关于MySQL存储IP地址引发的思考
2023-09-27 14:25:41 时间
产生思考
今天在看《高性能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>
相关文章
- MySQL的DDL、DML与DCL语句
- 【MySQL】索引优化中的最左前缀原则和索引下推
- Mysql索引会失效的几种情况分析
- 如何使用MySQL Workbench创建数据库存储过程
- MySql 模糊查询,按匹配度排序
- mysql查看表结构
- Python中操作mysql的pymysql模块详解
- mysql存储过程3-1 实现每天定时从A表按天同步到B表(含建表,同步数据,删除旧数据)
- mysql存储过程实现3-2 定时删除指定表中指定时间点的数据
- mysql存储过程1 实现全量同步数据并自动创建表(含数据和结构)
- 关于用 MySQL 存储 Emoji
- MySql 存储过程实例(附完整注释)
- 2022-10-26 mysql列存储引擎-自定义不支持-问题定位及解决
- 2022-10-08 mysql列存储引擎-TPCH数据集1GB数据量-测试SQL
- 2022-09-11 mysql列存储引擎-宣讲-第二讲-一条SQL在Tianmu引擎中的运行
- 2023-03-08 mysql列存储数据库-查询执行过程分析
- 2022-09-22 mysql列存储引擎-支持自定义函数-需求分析
- 2022-09-20 mysql列存储引擎-POC-问题定位-索引相关
- MySQL的事务理解
- 一些应该使用mongodb或者其他文档存储而不是redis或mysql、oracle json的情形(最近更新场景)
- MYSQL如何导出存储过程和触发器?
- HADOOP之HIVE+MYSQL,HBASE+ZOOKEEPER
- mysql中的函数与存储过程
- openresty使用lua操作mysql