MYSQL - ВЫБЕРИТЕ IP v4 / v6, inet_pton & bin2hex - PullRequest
2 голосов
/ 11 февраля 2012

У меня проблемы с выбором правильных значений на моем сервере MySQL SQL.

ip может быть ipv6 и v4.

Таблица: пользователь {

...

ip binary (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 - нет.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Можете ли вы использовать VARBINARY вместо BINARY?

Из руководства MySQL по Binary / Varbinary :

Если полученное значение должно совпадать со значением, указанным для хранилище без заполнения, может быть предпочтительнее использовать VARBINARY или вместо этого один из типов данных BLOB.

1 голос
/ 11 февраля 2012

ОБНОВЛЕНИЕ:

MySQL 5.6.3 и выше поддерживают IPv6-адреса - см. Следующее: «INET6_ATON (expr)»

Тип данных:VARBINARY(16) вместо BINARY(16), как было предложено в предыдущих комментариях здесь.Единственная причина этого заключается в том, что функции MySQL работают как для адресов IPv6, так и для адресов IPv4.BINARY(16) отлично подходит для хранения только адресов IPv6 и сохраняет один байт.VARBINARY(16) следует использовать при обработке адресов IPv6 и IPv4.

...