错误解答
之前面试官问我一个问题:
- MySql如何储存ip地址?
我是这么回答的:
- 使用varchar,然后在dao层或service层将这个字符串转换为数组,然后再进行拼接…
然后最近去专门了解过后,发现了mysql提供了两个函数专门储存ip地址,大大提高了效率
正确解答:inet_aton和inet_ntoa函数
inet_aton:将ip地址转换为无符号整数
inet_ntoa:将通过INET_ATON储存的无符号整数转换为对应的ip
在这里我创建了一个表testip,并且表结构如下:ip这个字段须是bigint类型,如果是int的话,插入ip地址会报错
插入ip地址:INET_ATON
INSERT INTO testip(NAME,ip) VALUES
('localhost',INET_ATON('127.0.0.1')),
('local',INET_ATON('192.168.0.1'));
获取IP地址:INET_NTOA
SELECT NAME,INET_NTOA(ip) AS '通过函数获取的ip数值',ip AS '数据库中储存的ip数值' FROM testip;
尝试添加有端口号的,报错!所以这两个函数只能添加ip地址,无法同时添加端口
上面两个函数的底层实现原理
通过上面的数据显示可以发现,localhost这个name的ip地址在数据库中储存的是二进制转换为十进制
IP地址与二进制之间的转换其实就是十进制与二进制之间的转换
二进制与十进制的转换
IP地址可以表示成这种32位二进制形式
- 11000000, 10101000, 00111011, 00011000
也可以是4位十进制形式:
- 192.168.59.24
比如我上面的实例:
127
.0.0
.1
转换为二进制就为:
0111 1111
.0000 0000.0000 0000
.0000 0001
而:0111 1111 0000 0000 0000 0000 0000 0001的十进制数为:2130706433
所以以上便是mysql的两个函数的底层实现原理