Php MYSQL-选择IP v4/v6、inet\u pton&;bin2hex
我在从mysql sql server中选择正确的值时遇到了一些问题 ip可以是ipv6和v4 表:用户{ ip二进制(16) } 如何获得与*00000*的可行匹配Php MYSQL-选择IP v4/v6、inet\u pton&;bin2hex,php,mysql,select,hex,ip,Php,Mysql,Select,Hex,Ip,我在从mysql sql server中选择正确的值时遇到了一些问题 ip可以是ipv6和v4 表:用户{ ip二进制(16) } 如何获得与*00000*的可行匹配 如果输入是ipv6匹配,则可以,但ip v4不可以。更新: MySQL 5.6.3及更高版本支持IPv6地址-请参阅以下内容:“INET6_ATON(expr)” 数据类型是VARBINARY(16),而不是前面的评论所建议的BINARY(16)。唯一的原因是MySQL函数同时适用于IPv6和IPv4地址BINARY(16)可以
如果输入是ipv6匹配,则可以,但ip v4不可以。更新: MySQL 5.6.3及更高版本支持IPv6地址-请参阅以下内容:“INET6_ATON(expr)”
数据类型是
VARBINARY(16)
,而不是前面的评论所建议的BINARY(16)
。唯一的原因是MySQL函数同时适用于IPv6和IPv4地址BINARY(16)
可以只存储IPv6地址并保存一个字节VARBINARY(16)
在处理IPv6和IPv4地址时应使用。您可以使用VARBINARY
而不仅仅是BINARY
从MySQL手册:
如果检索到的值必须与为指定的值相同
没有填充的存储,最好使用VARBINARY或
而不是BLOB数据类型之一
尝试更改为
ip VARBINARY(16)
?如果将变量存储为十六进制数,请将列更改为数字HEX()
将用于数字输入。@drew010我使用了您的解决方案,效果非常好。不幸的是,ipv6不适用于ipv6如果您想在同一字段中处理ipv4和ipv6,并且如果您使用的是Mysql 5.6或更高版本,则可以使用varbinary(16)和函数inet6_aton和inet6_ntoa。这是一个更好的例子,说明了为什么应该使用MySQL函数
$ip = '192.168.10.115';
$ip = bin2hex(inet_pton($ip)); // Returns c0a80a73
$result = $this->db->select("SELECT * FROM User WHERE HEX(ip) = $ip");
// $result empty because in db its stored as:
// HEX(ip) = C0A80A73000000000000000000000000