前言
做一个项目要用到IP存储,肯定是占用空间越少越好,使用bigint(10)
类型即可
MySQL函数
inet_aton : 将IP转为整型
inet_ntoa : 将整型转为IP
建表
CREATE TABLE `testip` (
`IP` bigint(10) NULL
)
插入数据
INSERT INTO testip (IP) VALUES (INET_ATON('255.255.255.255'))
4294967295
查询数据
SELECT INET_NTOA(IP) IP FROM testip
255.255.255.255
ThinkPHP查询
$data = Db::name('testip')
->fieldRaw('INET_NTOA(ip) as ip')
->select();
原生PHP
- php函数 ip2long() 将IPV4地址转为数字格式
PHP函数 long2ip() 将数组格式转为IP地址类型
$ip = '172.28.0.122'; $iplong = sprintf('%u',ip2long($ip)); echo $iplong.PHP_EOL;//2887516282 echo long2ip($iplong);//172.28.0.122
直接使用ip2long()函数会出现转换后为负数的情况(IP较大),使用%u来格式化为无符号整型。
出现负数
当ip地址比较大时,ip2long会出现负数:
$ip = '192.168.100.1';
$ip_long = ip2long($ip);
echo $ip_long.PHP_EOL; // -1062706175
echo long2ip($ip_long); // 192.168.100.1
原因:
IPv4使用无符号32位地址,因此最多有2的32次方减1(4294967295)个地址。书写用4个小数点分开的10进制数。
记为A.B.C.D,例如:192.168.100.100。
IPv4地址每个10进制数都是无符号的字节,范围在0~255,将IPv4地址转为无符号数,
废话不多说了,解决办法:
输出时用%u来格式化为无符号整型。
$ip = '192.168.100.1';
$ip_long = sprintf('%u',ip2long($ip));
echo $ip_long.PHP_EOL; // 3232261121
echo long2ip($ip_long); // 192.168.100.1