MySQL存储IP地址的方法

作者:Surjur 时间:2024-01-23 06:01:02 

为什么要问如何存储IP?

首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗?

其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。

利用函数算法处理

在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间。因为varchar是可变长形,需要多余的一个字节存储长度。另外int型在逻辑运算上要比varchar速度快。

IP转数字函数inet_aton()

我们转换下几个常用的IP地址


mysql> select inet_aton('255.255.255.255');
+------------------------------+
| inet_aton('255.255.255.255') |
+------------------------------+
|     4294967295 |
+------------------------------+
1 row in set (0.00 sec)

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_aton('10.10.10.10');
+--------------------------+
| inet_aton('10.10.10.10') |
+--------------------------+
|    168430090 |
+--------------------------+
1 row in set (0.00 sec)

所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思 

数字转IP函数inet_ntoa()


mysql> select inet_ntoa(4294967295);
+-----------------------+
| inet_ntoa(4294967295) |
+-----------------------+
| 255.255.255.255  |
+-----------------------+
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> select inet_ntoa(168430090);
+----------------------+
| inet_ntoa(168430090) |
+----------------------+
| 10.10.10.10   |
+----------------------+
1 row in set (0.00 sec)

mysql> select inet_ntoa(0);  
+--------------+
| inet_ntoa(0) |
+--------------+
| 0.0.0.0  |
+--------------+
1 row in set (0.00 sec)

注意,0转换为 0.0.0.0

 整型字段的比较比字符串效率高很多,这也符合一项优化原则:字段类型定义使用最合适(最小),最简单的数据类型。
inet_aton()算法,其实借用了国际上对各国IP地址的区分中使用的ip number。
a.b.c.d 的ip number是:
a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方。

mysql 存储ip地址

mysql提供了两个方法来处理ip地址:

inet_aton 把ip转为无符号整型(4-8位)
inet_ntoa 把整型的ip转为电地址

插入数据前,先用inet_aton把ip地址转为整型,可以节省空间。
显示数据时,使用inet_ntoa把整型的ip地址转为电地址显示即可。为社么这样存?,性能上的提示比直接存储字符串的IP要高出很多。

示例:


CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL COMMENT '用户名',
`ip` bigint(20) DEFAULT NULL COMMENT 'IP地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入几条数据:


INSERT INTO `t_user` ( `id`, `name`, `ip` )
VALUES
 ( 2, 'babala', inet_aton( '127.0.0.1' ) ),
 ( 3, 'maly', inet_aton( '192.168.1.1' ) ),
 ( 4, 'kaven', inet_aton( '111.175.7.143' ) );

查询显示地址:

select id,name,inet_ntoa(ip) as ip from `t_user`;

MySQL存储IP地址的方法

如果需要找出在某个网段的用户(例如:192.168.1.1 ~ 192.168.1.100),可以利用php的ip2long方法,把ip地址转为整型,再进行比较。


$ip_start = '192.168.1.1';
$ip_end = '192.168.1.100';
echo sprintf('%u',ip2long($ip_start)).PHP_EOL; // 3232235777
echo sprintf('%u',ip2long($ip_end)).PHP_EOL;   // 3232235876

MySQL存储IP地址的方法

总结

1.保存ip地址到数据库,使用unsigned int格式,插入时使用inet_aton方法把ip先转为无符号整型,可以节省存储空间。
2.显示时使用inet_ntoa把整型ip地址转为电地址。
3.php 使用 ip2long转ip为整型时,需要注意出现负数的问题(如果出现负数:参照之前我写的这篇)

以上讲解的就是MySQL存储IP地址的方法,希望能够对大家的学习有所帮助。

标签:MySQL,IP存储
0
投稿

猜你喜欢

  • python2.7安装opencv-python很慢且总是失败问题

    2021-01-10 06:11:15
  • request基本使用及各种请求方式参数的示例

    2021-03-31 02:32:52
  • 关于golang中平行赋值浅析

    2024-05-05 09:33:42
  • 如何在PyCharm中配置使用Anaconda环境

    2021-01-28 14:16:53
  • 设计上的小细节

    2010-06-24 21:44:00
  • Python编写带选项的命令行程序方法

    2023-11-18 20:47:35
  • python client使用http post 到server端的代码

    2021-09-03 14:33:54
  • 使用Pyparsing处理复杂文本实现过程

    2023-03-21 13:37:44
  • elementUI el-table二次封装的详细实例

    2024-05-03 15:12:00
  • Python获取图像中像素点坐标实例代码

    2021-02-20 19:42:05
  • MySQL定位并优化慢查询sql的详细实例

    2024-01-25 20:32:16
  • 通过Python爬虫代理IP快速增加博客阅读量

    2023-08-17 16:17:55
  • mysql部分替换sql语句分享

    2024-01-23 18:17:35
  • python单元测试框架pytest介绍

    2021-06-11 15:28:55
  • python通过urllib2获取带有中文参数url内容的方法

    2022-07-26 10:35:58
  • RSS2.0规范中文版

    2008-06-25 13:53:00
  • 使用python将请求的requests headers参数格式化方法

    2021-06-12 07:22:49
  • Python贪心算法实例小结

    2021-08-05 21:10:17
  • 浅析阿里巴巴前端招聘考题

    2008-01-19 09:52:00
  • Yii框架实现乐观锁与悲观锁流程详解

    2023-11-16 13:38:38
  • asp之家 网络编程 m.aspxhome.com