8.8. Типы сетевых адресов

PostgreSQL предлагает типы данных для хранения адресов IPv4, IPv6 и MAC, как показано в Table 8-17. Для хранения сетевых адресов вместо обычных текстовых типов данных, предпочтительным является использование этих типов, потому что эти типы предоставляют проверку вводимых значений на ошибки, а также некоторые специализированные операторы и функции (см. Section 9.11).

Table 8-17. Типы сетевых адресов

ИмяРазмер храненияОписание
cidr12 или 24 байтIPv4 и IPv6 сети
inet12 или 24 байтIPv4 и IPv6 узлы и сети
macaddr6 байтMAC адреса

При сортировке типов данных inet и cidr, адреса IPv4 всегда будут находится перед адресами IPv6, включая адреса IPv4 инкапсулированные или отображённые в адреса IPv6, такие как ::10.2.3.4 или ::ffff::10.4.3.2.

8.8.1. inet

Значениями типа inet могут быть IPv4 или IPv6 адреса узлов, а также подсети, в которые входят эти адреса - всё в одном поле. Подсети представляются количеством бит адреса узла, которые представляют адрес сети ("netmask"(сетевую маску)). Если значение сетевой маски равно 32, а адрес IPv4, то значение не задаёт подсеть, а только одиночный узел. В IPv6, длина адреса равна 128 битам, так что 128 бит, задают уникальный адрес узла. Заметим, что если вы хотите ввести только сеть, то вы должны использовать вместо типа inet тип cidr.

Формат ввода для этого типа это address/y где address это IPv4 или IPv6 адрес, а y это количество бит в сетевой маске. Если часть /y отсутствует, то сетевая маска считается равной 32 для IPv4 и 128 для IPv6, таким образом, задавая только один узел. При выводе, если часть /y задаёт только один узел, то она не показывается.

8.8.2. cidr

Значениями типа cidr могут быть спецификации сетей IPv4 и IPv6. Форматы ввода и вывода соответствуют соглашениям Classless Internet Domain Routing. Формат для задания сетей следующий: address/y где address — это сетевое представление IPv4 или IPv6 адреса, а y — это количество бит в сетевой маске. Если часть y опущена, она вычисляется с помощью старой классификации номеров сетей, в тех случаях, когда это возможно, исходя из введённого значения адреса. Является ошибкой задание сетевого адреса, который устанавливает те же биты, что и значение сетевой маски справа.

Table 8-18 показывает некоторые примеры.

Table 8-18. cidr Примеры ввода значений

cidr Вводcidr Выводabbrev(cidr)
192.168.100.128/25192.168.100.128/25192.168.100.128/25
192.168/24192.168.0.0/24192.168.0/24
192.168/25192.168.0.0/25192.168.0.0/25
192.168.1192.168.1.0/24192.168.1/24
192.168192.168.0.0/24192.168.0/24
128.1128.1.0.0/16128.1/16
128128.0.0.0/16128.0/16
128.1.2128.1.2.0/24128.1.2/24
10.1.210.1.2.0/2410.1.2/24
10.110.1.0.0/1610.1/16
1010.0.0.0/810/8
10.1.2.3/3210.1.2.3/3210.1.2.3/32
2001:4f8:3:ba::/642001:4f8:3:ba::/642001:4f8:3:ba::/64
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:2e0:81ff:fe22:d1f1/1282001:4f8:3:ba:2e0:81ff:fe22:d1f1
::ffff:1.2.3.0/120::ffff:1.2.3.0/120::ffff:1.2.3/120
::ffff:1.2.3.0/128::ffff:1.2.3.0/128::ffff:1.2.3.0/128

8.8.3. Сравнение типов inet и cidr

Важнейшее отличие между типами данных inet и cidr состоит в том, что тип inet допускает значения с ненулевыми битами в правой части сетевой маски, в то время как cidr нет.

Tip: Если вам не нравится формат вывода значений inet или cidr, то попытайтесь использовать функции host, text и abbrev.

8.8.4. macaddr

Значениями типа macaddr могут быть MAC адреса, т.е. аппаратные адреса Ethernet карт (также MAC адреса используются и для других целей). Ввод значений допускается в нескольких форматах, включая

'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'08-00-2b-01-02-03'
'08:00:2b:01:02:03'

и все эти значения задают тот же самый адрес. Для цифр допускаются значения как в верхнем так и в нижнем регистрах от a до f. Вывод всегда осуществляется в последнем из указанных форматов.

Каталог contrib/mac в исходных текстах PostgreSQL содержит инструменты, которые можно использовать для отражения MAC адресов на имена производителей аппаратного обеспечения.