MySQL 的inet_aton()和inet_ntoa()函数存储IP地址

当前很多应用都适用字符串char(15)来存储IP地址(占用16个字节),利用inet_aton()和inet_ntoa()函数,来存储IP地址效率很高,适用unsigned int 就可以满足需求,不需要使用bigint,只需要4个字节,节省存储空间,同时效率也高很多

 

为什么要问如何存储IP?

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

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

利用函数算法处理

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

unsigned介绍


整型的每一种都分有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。


mysql提供了两个方法来处理ip地址
inet_aton 把ip转为无符号整型(4-8位) 
inet_ntoa 把整型的ip转为电地址
插入数据前,先用inet_aton把ip地址转为整型,可以节省空间,因为char(15) 占16字节。 
显示数据时,使用inet_ntoa把整型的ip地址转为电地址显示即可。

mysql> create table user_bye (ip int unsigned, name varchar(10));

mysql> insert into user_bye values(inet_aton('192.168.1.200'), '张三');

mysql> insert into user_bye values(inet_aton('24.89.35.27'), '李四'), (inet_aton('100.200.30.22'), '王五');

mysql> select * from user_bye;

+------------+------+ 
| ip         | name | 
+------------+------+ 
| 3232235976 | 张三 |
| 408494875  | 李四 | 
| 1690836502 | 王五 | 
+------------+------+ 

mysql> select * from user_bye where ip = inet_aton('192.168.1.200'); 

+------------+------+ 
| ip         | name | 
+------------+------+ 
| 3232235976 | 张三 |
+------------+------+ 

mysql> select inet_ntoa(ip) from user_bye; 

+--------------------+ 
| inet_ntoa(ip)      | 
+--------------------+ 
| 192.168.1.200      |
| 24.89.35.27        |
| 100.200.30.22      |
+--------------------+

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章