前言

做一个项目要用到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
最后修改:2021 年 04 月 01 日
如果觉得我的文章对你有用,请随意赞赏