Перейти к содержимому
Последнее обновление

IS_IP_ADDRESS_IN_RANGE

Описание​

Проверяет, входит ли указанный IP-адрес в заданный диапазон сети CIDR. Поддерживает адреса IPv4 и IPv6.

Синтаксис​

IS_IP_ADDRESS_IN_RANGE(<ip_address>, <cidr_range>)

Параметры​

  • <ip_address>: проверяемый IP-адрес (значение типа IPv4, IPv6 или строка)
  • <cidr_range>: диапазон сети CIDR (в строковом формате, например "192.168.1.0/24")

Возвращаемое значение​

Тип возвращаемого значения: BOOLEAN

Значение результата:

  • Возвращает 1: IP-адрес входит в указанный диапазон CIDR
  • Возвращает 0: IP-адрес не входит в указанный диапазон CIDR
  • Возвращает NULL, если входное значение равно NULL

Примечания по использованию​

  • Поддерживает проверку адресов IPv4 и IPv6
  • Диапазон CIDR должен быть указан в допустимом формате (например, "192.168.1.0/24" или "2001:db8::/64")
  • Поддерживает оптимизацию с использованием инвертированного индекса: если параметр CIDR является константой, для ускорения можно использовать индекс
  • Возвращает 0 при некорректном формате CIDR
  • Возвращает NULL, если входной параметр равен NULL

Примеры​

Проверка того, входит ли адрес IPv4 в указанный сегмент сети.

SELECT is_ip_address_in_range(to_ipv4('192.168.1.100'), '192.168.1.0/24') as in_range;
+----------+
| in_range |
+----------+
| 1 |
+----------+

Проверка того, входит ли адрес IPv6 в указанный сегмент сети.

SELECT is_ip_address_in_range(INET6_ATON('2001:db8::100'), '2001:db8::/64') as in_range;
+----------+
| in_range |
+----------+
| 1 |
+----------+

Проверка того, входят ли несколько адресов в указанный сегмент сети.

SELECT 
is_ip_address_in_range(to_ipv4('192.168.1.100'), '192.168.1.0/24') as in_192_168_1,
is_ip_address_in_range(to_ipv4('192.168.2.100'), '192.168.1.0/24') as in_192_168_2,
is_ip_address_in_range(to_ipv4('10.0.0.1'), '192.168.1.0/24') as in_10_0_0;
+-------------+-------------+----------+
| in_192_168_1| in_192_168_2| in_10_0_0|
+-------------+-------------+----------+
| 1 | 0 | 0 |
+-------------+-------------+----------+

Проверка диапазонов с разной длиной префикса CIDR.

SELECT 
is_ip_address_in_range(to_ipv4('192.168.1.100'), '192.168.0.0/16') as in_16,
is_ip_address_in_range(to_ipv4('192.168.1.100'), '192.168.1.0/24') as in_24,
is_ip_address_in_range(to_ipv4('192.168.1.100'), '192.168.1.100/32') as in_32;
+--------+--------+--------+
| in_16 | in_24 | in_32 |
+--------+--------+--------+
| 1 | 1 | 1 |
+--------+--------+--------+

При некорректном формате CIDR возвращается 0.

SELECT is_ip_address_in_range(to_ipv4('192.168.1.100'), 'invalid-cidr') as in_range;
+----------+
| in_range |
+----------+
| 0 |
+----------+

Если входной параметр равен NULL, возвращается NULL.

SELECT is_ip_address_in_range(NULL, '192.168.1.0/24') as null_ip;
+---------+
| null_ip |
+---------+
| NULL |
+---------+

SELECT is_ip_address_in_range(to_ipv4('192.168.1.100'), NULL) as null_cidr;
+-----------+
| null_cidr |
+-----------+
| NULL |
+-----------+

SELECT is_ip_address_in_range(NULL, NULL) as both_null;
+-----------+
| both_null |
+-----------+
| NULL |
+-----------+

Ключевые слова​

IS_IP_ADDRESS_IN_RANGE