Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在mysql中将二进制转换为整数?_Php_Mysql_Ip Address - Fatal编程技术网

Php 如何在mysql中将二进制转换为整数?

Php 如何在mysql中将二进制转换为整数?,php,mysql,ip-address,Php,Mysql,Ip Address,要正确地回答我的问题: 我有一个PHP应用程序,它将用户的IP存储在MySQL表中 列类型为VARBINARY(16),应用程序使用PHP的inet\u pton形成二进制字符串 也就是说,对于典型的IP4地址,字符串有4个字节 如何从表中检索这些IP,并以人类可读的形式显示它们 我目前的解决办法是: select INET_NTOA(CONV(HEX(ip),16,10)) from operation_ip; 有没有更直接的方法 特别是CONV(HEX(x),16,10)是将4个字节更改为

要正确地回答我的问题:

我有一个PHP应用程序,它将用户的IP存储在MySQL表中

列类型为
VARBINARY(16)
,应用程序使用PHP的
inet\u pton
形成二进制字符串

也就是说,对于典型的IP4地址,字符串有4个字节

如何从表中检索这些IP,并以人类可读的形式显示它们

我目前的解决办法是:

select INET_NTOA(CONV(HEX(ip),16,10)) from operation_ip;
有没有更直接的方法

特别是
CONV(HEX(x),16,10)
是将4个字节更改为整数的最简单方法(实际上我相信它甚至不是整数,而是看起来像整数的字符串)


(我使用
VARBINARY(16)
,因为PHP的
inet\u pton
可以为IPv6地址返回16字节。AFAIK MySQL的
inet\u NTOA
不支持IPv6,但目前这不是我最担心的问题)。

MySQL有很好的内置函数来处理这种情况:

INSERT INTO t(ip) VALUE (INET_ATON('1.2.3.4')); -- stores integer 16909060
SELECT INET_NTOA(ip) FROM t; -- returns string '1.2.3.4'
或者PHP方式:

$sql='插入t(ip)值('.ip2long('1.2.3.4'));
//ip2long('1.2.3.4')=16909060
//反向转换:long2ip(16909060)返回“1.2.3.4”

如果您想要更直接的形式,请不要为了将ip地址存储在数据库中而将其转换为二进制。。。如果我理解正确,您的解决方案是使用4字节整数作为列的类型。不幸的是,IPv6需要16个字节,MySQL不支持这么长的整数,这就是我使用VARBINARY(16)的原因。另一方面,在一些查询中,我100%确定结果只包含IPv4地址的行,在这种情况下,我希望快速将VARBINARY(16)转换为(4字节)INT。我忽略了IPv6的问题,因为您写了“IPv6(…)不是我最关心的问题”。从v5.6.3开始,MySQL提供了您所需要的功能:和。在那之前,你的方法可能是最好的选择。不过,我不会将IPv4和IPv6存储在同一列中,而是存储在不同的列中。