Сравнение IP-адреса IPv4 с сетевым адресом, хранящимся на MYSQL - PullRequest
1 голос
/ 31 марта 2020

У меня есть большая таблица, содержащая 3 миллиона сетевых адресов и информацию об их расположении

basi c поля:

network: eg. 74.142.124.116/30,

latitude: eg. 40475, 

longitude: eg. 37.7548

Система также захватывает IPv4-адрес пользователя, обращающегося к сервис (скажем, 216.255.211.106).

Я хочу сравнить этот IPv4 и сетевой адрес и найти IP-адрес. Есть ли способ сделать это в MySQL или node.JS?

1 Ответ

2 голосов
/ 31 марта 2020

Вы можете использовать следующий метод:

  • Сохранить сеть как 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.

...