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
| Nombre | Tamaño de almacenamiento | Descripción |
|---|---|---|
cidr | 7 o 19 bytes | redes IPv4 e IPv6 |
inet | 7 o 19 bytes | hosts y redes IPv4 e IPv6 |
macaddr | 6 bytes | direcciones MAC |
macaddr8 | 8 bytes | direcciones 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.
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.
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 cidr | Salida cidr | |
|---|---|---|
| 192.168.100.128/25 | 192.168.100.128/25 | 192.168.100.128/25 |
| 192.168/24 | 192.168.0.0/24 | 192.168.0/24 |
| 192.168/25 | 192.168.0.0/25 | 192.168.0.0/25 |
| 192.168.1 | 192.168.1.0/24 | 192.168.1/24 |
| 192.168 | 192.168.0.0/24 | 192.168.0/24 |
| 128.1 | 128.1.0.0/16 | 128.1/16 |
| 128 | 128.0.0.0/16 | 128.0/16 |
| 128.1.2 | 128.1.2.0/24 | 128.1.2/24 |
| 10.1.2 | 10.1.2.0/24 | 10.1.2/24 |
| 10.1 | 10.1.0.0/16 | 10.1/16 |
| 10 | 10.0.0.0/8 | 10/8 |
| 10.1.2.3/32 | 10.1.2.3/32 | 10.1.2.3/32 |
| 2001:4f8:3:ba::/64 | 2001:4f8:3:ba::/64 | 2001:4f8:3:ba/64 |
| 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128 | 2001: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 |
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.
Si no te agrada el formato de salida para los valores inet o
cidr, intenta usar las funciones host,
text y abbrev.
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.
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)