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

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

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

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

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

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

8.9.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.9.2. cidr

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

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

Table 8-22. 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.9.3. Сравнение типов inet и cidr

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

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

8.9.4. macaddr

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

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

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

Стандарт IEEE 802-2001 задаёт вторую из показанных выше форм (с переносами) как каноническую форму для MAC адресов и задаёт первую из показанных выше форм (с двоеточиями) как бит-зарезервированную нотацию, так что 08-00-2b-01-02-03 = 01:00:4D:08:04:0C. Это соглашение в настоящее время широко игнорируется и является справедливым только для устаревших сетевых протоколов (таких как Token Ring). PostgreSQL не отвергает бит-зарезервированную нотацию и всегда принимает форматы, используя канонический порядок LSB.

Оставшиеся четыре входных формата не соответствуют каким-либо стандартам.

Back to top

(С) Виктор Вислобоков, 2008-2023