Вы можете использовать следующий метод:
- Сохранить сеть как startIP и endIP (сеть и широковещание) в двух отдельных столбцах в MySQL
- Найти запись, содержащую адрес с использованием простого запроса диапазона (
ip >= startIP and ip <= endIP
)
Подробности реализации:
Оптимальный тип данных для адреса IPv4 в MySQL равен INT UNSIGNED
. Вы можете преобразовать свои существующие данные, рассчитав сетевые и широковещательные адреса следующим образом: 216.255.211.106 ') вы можете запросить таблицу (вам нужно добавить индекс (startIP, endIP) как:
select lat, long from mytable where inet_aton(@sourceIP) >= startIP and inet_aton(@sourceIP) <= endIP
(@ sourceIP - значение параметра)
В зависимости от Качество ваших данных, вы можете получить несколько результатов (например, перекрывающиеся диапазоны сети в вашем наборе данных)
Обновление
Кредиты для ответа Бернда Буффена здесь
Вы можете использовать следующую инструкцию для заполнения двух новых столбцов:
update mytable set
startIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
& 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(cidr, '/', -1)) ) -1 )
, endIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
| ((0x100000000 >> SUBSTRING_INDEX(cidr, '/', -1) ) -1 )
Предполагая, что исходная таблица имеет столбец cidr
.