8.9. Tipos de direcciones de red #

8.9.1. inet
8.9.2. cidr
8.9.3. inet vs. cidr
8.9.4. macaddr
8.9.5. macaddr8

PostgreSQL ofrece tipos de datos para almacenar direcciones IPv4, IPv6 y MAC, como se muestra en la Table 8.21. Es mejor utilizar estos tipos en lugar de tipos de texto plano para almacenar direcciones de red, porque estos tipos ofrecen comprobación de errores de entrada y operadores y funciones especializados (consulta la Section 9.12).

Table 8.21. Tipos de direcciones de red

NombreTamaño de almacenamientoDescripción
cidr7 o 19 bytesredes IPv4 e IPv6
inet7 o 19 byteshosts y redes IPv4 e IPv6
macaddr6 bytesdirecciones MAC
macaddr88 bytesdirecciones MAC (formato EUI-64)

Al ordenar tipos de datos inet o cidr, las direcciones IPv4 siempre se ordenarán antes que las direcciones IPv6, incluyendo las direcciones IPv4 encapsuladas o asignadas a direcciones IPv6, tales como ::10.2.3.4 o ::ffff:10.4.3.2.

8.9.1. inet #

El tipo inet almacena una dirección de host IPv4 o IPv6, y opcionalmente su subred, todo en un solo campo. La subred se representa por el número de bits de dirección de red presentes en la dirección del host (la máscara de red o netmask). Si la máscara de red es 32 y la dirección es IPv4, entonces el valor no indica una subred, sino un único host. En IPv6, la longitud de la dirección es de 128 bits, por lo que 128 bits especifican una dirección de host única. Ten en cuenta que si deseas aceptar únicamente redes, deberías utilizar el tipo cidr en lugar de inet.

El formato de entrada para este tipo es dirección/y donde dirección es una dirección IPv4 o IPv6 e y es el número de bits en la máscara de red. Si se omite la porción /y, se toma la máscara de red como 32 para IPv4 o 128 para IPv6, por lo que el valor representa un único host. Al mostrarse, se suprime la porción /y si la máscara de red especifica un único host.

8.9.2. cidr #

El tipo cidr almacena una especificación de red IPv4 o IPv6. Los formatos de entrada y salida siguen las convenciones de enrutamiento entre dominios sin clases (Classless Internet Domain Routing, CIDR). El formato para especificar redes es dirección/y donde dirección es la dirección más baja de la red representada como una dirección IPv4 o IPv6, e y es el número de bits en la máscara de red. Si se omite y, se calcula utilizando suposiciones del antiguo sistema de numeración de redes por clases, excepto que será al menos lo suficientemente grande como para incluir todos los octetos escritos en la entrada. Es un error especificar una dirección de red que tenga bits establecidos a la derecha de la máscara de red especificada.

La Table 8.22 muestra algunos ejemplos.

Table 8.22. Ejemplos de entrada del tipo cidr

Entrada cidrSalida cidrabbrev(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/128
::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 vs. cidr #

La diferencia esencial entre los tipos de datos inet y cidr es que inet acepta valores con bits distintos de cero a la derecha de la máscara de red, mientras que cidr no lo hace. Por ejemplo, 192.168.0.1/24 es válido para inet pero no para cidr.

Tip

Si no te agrada el formato de salida para los valores inet o cidr, intenta usar las funciones host, text y abbrev.

8.9.4. macaddr #

El tipo macaddr almacena direcciones MAC, conocidas por ejemplo por las direcciones de hardware de las tarjetas Ethernet (aunque las direcciones MAC se utilizan también para otros fines). La entrada se acepta en los siguientes formatos:

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

Todos estos ejemplos especifican la misma dirección. Se aceptan mayúsculas y minúsculas para los dígitos de la a a la f. La salida se presenta siempre en la primera de las formas mostradas.

El estándar IEEE 802-2001 especifica la segunda forma mostrada (con guiones) como la forma canónica para las direcciones MAC, y especifica la primera forma (con dos puntos) como la utilizada con la notación de bits invertidos, MSB primero, de modo que 08-00-2b-01-02-03 = 10:00:D4:80:40:C0. Esta convención se ignora ampliamente hoy en día, y solo es relevante para protocolos de red obsoletos (como Token Ring). PostgreSQL no prevé la inversión de bits; todos los formatos aceptados utilizan el orden LSB canónico.

Los cinco formatos de entrada restantes no forman parte de ningún estándar.

8.9.5. macaddr8 #

El tipo macaddr8 almacena direcciones MAC en formato EUI-64, conocido por ejemplo por las direcciones de hardware de las tarjetas Ethernet (aunque las direcciones MAC se utilizan también para otros fines). Este tipo puede aceptar direcciones MAC de 6 y 8 bytes de longitud y las almacena en un formato de 8 bytes de longitud. Las direcciones MAC dadas en formato de 6 bytes se almacenarán en formato de 8 bytes de longitud con el 4.º y 5.º bytes establecidos en FF y FE, respectivamente. Ten en cuenta que IPv6 utiliza un formato EUI-64 modificado donde el 7.º bit debe establecerse en uno después de la conversión desde EUI-48. La función macaddr8_set7bit se proporciona para realizar este cambio. En términos generales, se acepta cualquier entrada que conste de pares de dígitos hexadecimales (en límites de bytes), opcionalmente separados de manera consistente por alguno de los caracteres ':', '-' o '.'. El número de dígitos hexadecimales debe ser 16 (8 bytes) o 12 (6 bytes). Se ignoran los espacios en blanco iniciales y finales. Los siguientes son ejemplos de formatos de entrada que se aceptan:

'08:00:2b:01:02:03:04:05'
'08-00-2b-01-02-03-04-05'
'08002b:0102030405'
'08002b-0102030405'
'0800.2b01.0203.0405'
'0800-2b01-0203-0405'
'08002b01:02030405'
'08002b0102030405'

All these examples specify the same address. Upper and lower case is accepted for the digits a through f. Output is always in the first of the forms shown.

Los últimos seis formatos de entrada mostrados anteriormente no forman parte de ningún estándar.

Para convertir una dirección MAC tradicional de 48 bits en formato EUI-48 al formato EUI-64 modificado para incluirla como la parte del host de una dirección IPv6, utiliza macaddr8_set7bit como se muestra:

SELECT macaddr8_set7bit('08:00:2b:01:02:03');

    macaddr8_set7bit
-------------------------
 0a:00:2b:ff:fe:01:02:03
(1 row)