Поиск IP-адреса, хранящегося в двоичном формате, через php mysql

Я храню IP-адреса в таблице в упакованном двоичном виде (4 байта для IPv4 и 16 байтов для IPv6). Мой вопрос: есть ли способ поиска IP-адресов через SQL?

Я использовал php (inet_pton), чтобы преобразовать их в двоичные файлы. Я не знал о какой-либо функции MySQL, доступной для этого. Моя дилемма возникает при поиске части IP-адреса. Скажем, если IP-адрес 192.168.1.101, а пользователь ищет 101.

Поскольку inet_pton не будет работать для строки/целого числа, например 101, есть ли альтернатива поиску упакованных IP-адресов? Я открыт для предложений.


person Devon    schedule 20.04.2014    source источник
comment
Поиск IP-адреса по его суффиксу для меня не имеет смысла — например, нет никакой связи между 192.168.1.101 и 1.2.3.101. Что ты пытаешься сделать?   -  person    schedule 21.04.2014
comment
@duskwuff Это таблица серверов с их IP-адресами. Пользователь может не захотеть вводить весь IP-адрес и просто сузить результаты до части IP-адреса. Например, 192. или .101 или что они хотят делать.   -  person Devon    schedule 21.04.2014
comment
Однако вряд ли это когда-либо будет полезным способом поиска. IP-адреса организованы по префиксам; ваш поиск должен работать на этой основе.   -  person    schedule 21.04.2014
comment
@duskwuff, да, и подсети ... Подумайте об адресе IPv6. Если они хотят сузить все IP-адреса из /64. Это определенно было бы полезно.   -  person Devon    schedule 21.04.2014


Ответы (2)


Если вы разрешаете своим пользователям вводить любую допустимую подстроку для поиска, существует функция INET6_NTOA, которая преобразует упакованный адрес ipv4 или v 6 в двоичную строку, по которой вы затем можете выполнять сравнение строк. Это существует в версии 5.7 mysql.

person John Garrard    schedule 20.04.2014
comment
Это выглядит полезным для моих нужд. Я обдумываю, должен ли я хранить IP-адреса в текстовом представлении, а не в двоичном, после прохождения этого. ~ 12-20 байт, которые я сохраняю на запись, довольно ничтожны по сравнению со стоимостью обработки при поиске. - person Devon; 21.04.2014

Я знаю, что этот вопрос уже некоторое время не используется, но на всякий случай, если кто-то попытается решить аналогичную проблему, посмотрите мой ответ здесь: php поиск по частичному IP-адресу, хранящемуся в mysql как unsigned int . Обратите внимание, что подход с бинарной маской применим к адресам IPv6 и намного эффективнее (как с точки зрения требований к памяти, так и с точки зрения времени поиска), чем столбцы varchar.

person jwatkins    schedule 24.10.2014