MySQL存储IP地址的方法
为什么要问如何存储IP?
就来阐明一下部分人得反问为什么要问IP得怎样存,直接varchar类型不就得了吗?
其实做任何程序设计都要在功能实现的基础上最大限度的优化性能。而数据库设计是程序设计中不可忽略的一个重要部分,所以巧存IP地址可以一定程度获得很大提升。
利用函数算法处理
在MySQL中没有直接提供IP类型字段,但如果有两个函数可以把IP与最大长度为10位数字类型互转,所以使用int类型存储IP比varchar类型存储IP地址性能要提升很多,减少不少空间。因为varchar是可变长形,需要多余的一个字节存储长度。int型在逻辑运算上要比varchar速度快。
IP转数字函数i_aton()
我们转换下几个常用的IP地址
mysql> select i_aton('255.255.255.255'); +------------------------------+ | i_aton('255.255.255.255') | +------------------------------+ | 4294967295 | +------------------------------+ 1 row in set (0.00 sec) mysql> select i_aton('192.168.1.1'); +--------------------------+ | i_aton('192.168.1.1') | +--------------------------+ | 3232235777 | +--------------------------+ 1 row in set (0.00 sec) mysql> select i_aton('10.10.10.10'); +--------------------------+ | i_aton('10.10.10.10') | +--------------------------+ | 168430090 | +--------------------------+ 1 row in set (0.00 sec)
所以IP的表字段可以设置为INT(10)就好,如果IP获取不到可以直接存0代表获取不到IP的意思
数字转IP函数i_ntoa()
mysql> select i_ntoa(4294967295); +-----------------------+ | i_ntoa(4294967295) | +-----------------------+ | 255.255.255.255 | +-----------------------+ 1 row in set (0.00 sec) mysql> select i_ntoa(3232235777); +-----------------------+ | i_ntoa(3232235777) | +-----------------------+ | 192.168.1.1 | +-----------------------+ 1 row in set (0.00 sec) mysql> select i_ntoa(168430090); +----------------------+ | i_ntoa(168430090) | +----------------------+ | 10.10.10.10 | +----------------------+ 1 row in set (0.00 sec) mysql> select i_ntoa(0); +--------------+ | i_ntoa(0) | +--------------+ | 0.0.0.0 | +--------------+ 1 row in set (0.00 sec)
注意,0转换为 0.0.0.0
整型字段的比较比字符串效率高很多,这也符合一项优化原则字段类型定义使用最合适(最小),最简单的数据类型。
i_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地址
i_aton 把ip转为无符号整型(4-8位)
i_ntoa 把整型的ip转为电地址
插入数据前,先用i_aton把ip地址转为整型,可以节省空间。
显示数据时,使用i_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', i_aton( '127.0.0.1' ) ), ( 3, 'maly', i_aton( '192.168.1.1' ) ), ( 4, 'kaven', i_aton( '111.175.7.143' ) );
查询显示地址
select id,name,i_ntoa(ip) as ip from `t_user`;
如果需要找出在某个网段的用户(例如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
1.保存ip地址到数据库,使用unsigned int格式,插入时使用i_aton方法把ip先转为无符号整型,可以节省存储空间。
2.显示时使用i_ntoa把整型ip地址转为电地址。
3.php 使用 ip2long转ip为整型时,需要注意出现负数的问题(如果出现负数参照之前我写的这篇)
以上讲解的就是MySQL存储IP地址的方法,希望能够对大家的学习有所帮助。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南