У меня есть решение, когда адреса хранятся в виде строк.
Аналогичная проблема заключается в том, чтобы найти все адреса в базе данных, принадлежащие определенной подсети, что довольно похоже на проблему, указанную здесь, чтобы проверить, находятся ли два адреса в одной подсети.
Это немного сложно, особенно для IPv6. В IPv6 могут быть необязательно сжатые сегменты, такие как 1: 1, что эквивалентно 1: 0: 0: 0: 0: 0: 0: 1, что является основной причиной, по которой это сложно.
The IPAddress Java library произведет mysql SQL для поиска адресов в данной подсети. Ссылка описывает эту проблему более подробно. Отказ от ответственности: Я руководитель проекта.
Основной алгоритм состоит в том, чтобы взять сетевой раздел адреса подсети, затем взять каждый вариант этого раздела (например, две приведенные выше строки являются вариантами полного адреса 1 :: 1), а затем подсчитать количество сегментов разделители, затем выполните подстроку mysql на сопоставленном адресе, а также подсчитайте общие разделители в соответствующем адресе.
Вот пример кода:
public static void main(String[] args) throws IPAddressStringException {
System.out.println(getSearchSQL("columnX", "1.2.3.4/16"));
System.out.println(getSearchSQL("columnX", "1:2:3:4:5:6:7:8/64"));
System.out.println(getSearchSQL("columnX", "1::8/64"));
}
static String getSearchSQL(String expression, String ipAddressStr) throws IPAddressStringException {
IPAddressString ipAddressString = new IPAddressString(ipAddressStr);
IPAddress ipAddress = ipAddressString.toAddress();
IPAddressSection networkPrefix = ipAddress.getNetworkSection(ipAddress.getNetworkPrefixLength(), false);
StringBuilder sql = new StringBuilder("Select rows from table where ");
networkPrefix.getStartsWithSQLClause(sql, expression);
return sql.toString();
}
Ouptut:
Select rows from table where (substring_index(columnX,'.',2) = '1.2')
Select rows from table where (substring_index(columnX,':',4) = '1:2:3:4')
Select rows from table where ((substring_index(columnX,':',4) = '1:0:0:0') OR ((substring_index(columnX,':',2) = '1:') AND (LENGTH (columnX) - LENGTH(REPLACE(columnX, ':', '')) <= 5)))
я буду свистеть Рику на его соответствующий ответ [здесь] (http://dba.stackexchange.com/a/104844) – Drew
Ссылка, предоставленная Дрю, может быть более актуальной, чем мой ответ ниже. Сообщите мне, нужны ли вам дополнительные рекомендации. –