2012-02-10 28 views
2

我有点麻烦,从我的mysql sql server中选择正确的值。MYSQL - SELECT IP v4/v6,inet_pton&bin2hex

该ip可以是ipv6和v4。

表:用户{

...

IP二进制(16)

}

$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 

我怎样才能得到一个可行的比赛进行到* 00000 *?

如果输入是一个ipv6匹配,这将是好的,但ip v4不是。

+0

尝试更改为'IP VARBINARY(16)'? – drew010 2012-02-10 23:01:19

+0

如果您将该变量存储为十六进制数字,请将该列更改为数字...“HEX()”将用于数字输入。 – nickb 2012-02-10 23:04:47

+0

@ drew010我用你的解决方案,工作完美。 – 2012-02-10 23:37:52

回答

1

您可以使用VARBINARY而不仅仅是BINARY

从MySQL的手册上Binary/Varbinary

如果检索必须是相同的,作为 存储与没有填充指定的值的值,它可能是优选使用VARBINARY或 BLOB数据中的一个类型。

0

UPDATE:

IPv6的MySQL的5.6.3和较高有支持地址 - 请参见: “INET6_ATON(表达式)”

数据类型是VARBINARY(16)代替BINARY(16)作为建议通过此处的更早评论。唯一的原因是MySQL函数可以同时用于IPv6和IPv4地址。 BINARY(16)适用于仅存储IPv6地址并保存一个字节。处理IPv6和IPv4地址时应使用VARBINARY(16)

+0

不幸的是不适用于IPv6 – 2013-04-03 07:34:35

+1

如果您想在同一个字段中处理ipv4和ipv6,并且您使用的是Mysql 5.6或更高版本,则可以使用varbinary(16)以及函数inet6_aton和inet6_ntoa。这是为什么你应该使用MySQL函数的一个更好的例子 – 2013-07-01 18:28:41