2012-02-10 51 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