O PostgreSQL oferece tipos de dados para armazenar endereços IPv4, IPv6 e MAC, conforme mostrado na Tabela 8.21. É melhor usar esses tipos de dados em vez de usar tipos de dados de texto simples para armazenar endereços de rede, porque esses tipos de dados oferecem verificação de erros de entrada, além de operadores e funções especializados. (veja Seção 9.12).
Tabela 8.21. Tipos de dados de endereço de rede
| Nome | Tamanho de armazenamento | Descrição |
|---|---|---|
cidr | 7 ou 19 bytes | redes IPv4 e IPv6 |
inet | 7 ou 19 bytes | redes e hospedeiros IPv4 e IPv6 |
macaddr | 6 bytes | endereços MAC |
macaddr8 | 8 bytes | endereços MAC (formato EUI-64) |
Ao ordenar os tipos de dados inet ou cidr,
os endereços IPv4 sempre vêm antes dos endereços IPv6, incluindo os
Endereços IPv4 encapsulados ou mapeados para endereços IPv6, como
::10.2.3.4 ou ::ffff:10.4.3.2.
O tipo de dados inet guarda um endereço de hospedeiro
IPv4 ou IPv6 e, opcionalmente, sua sub-rede, tudo em um só campo.
A sub-rede é representada pelo número de bits de endereço de rede
presentes no endereço do hospedeiro (a “máscara de rede”).
Se a máscara de rede for 32 e o endereço for IPv4, o valor não
indicará uma sub-rede, indicará apenas um único hospedeiro.
No IPv6, o comprimento do endereço é de 128 bits, portanto
128 bits especificam o endereço de um único hospedeiro.
Note que se for desejado aceitar apenas redes, deve ser usado
o tipo de dados cidr em vez de inet.
O formato de entrada para o tipo de dados inet é
endereço/y,
onde
endereço
é um endereço IPv4 ou IPv6, e
y
é o número de bits na máscara de rede. Se a porção
/y
for omitida. a máscara de rede é assumida como sendo
32 para IPv4 ou 128 para IPv6,
então o valor representa apenas um único hospedeiro. Na saída,
a porção /y
é suprimida se a máscara de rede especificar um único hospedeiro.
O tipo de dados cidr armazena uma especificação de rede
IPv4 ou IPv6. O formato de entrada e de saída segue as convenções
Classless Inter-Domain Routing
(CIDR).
[48]
O formato para especificar redes é
endereço/y, onde
endereço
é o endereço mais baixo da rede representado como endereço IPv4
ou IPv6, e y é o
número de bits na máscara de rede.
Se y for omitido,
então é calculado usando suposições do antigo sistema de numeração
de rede com classe (classful),
exceto por ser pelo menos grande o suficiente para incluir todos
os octetos escritos na entrada.
É um erro especificar um endereço de rede que tenha bits definidos
à direita da máscara de rede especificada.
A Tabela 8.22 mostra alguns exemplos.
Tabela 8.22. Exemplos de entradas cidr
Entrada cidr | Saída 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 |
A diferença essencial entre os tipos de dados inet e
cidr é que inet aceita valores com bits
diferentes de zero à direita da máscara de rede, enquanto
cidr não aceita.
Por exemplo, 192.168.0.1/24 é um endereço válido
para inet, mas não para cidr.
Se não gostar do formato de saída para os valores de
inet ou cidr, experimente as funções
host, text e
abbrev.
O tipo de dados macaddr armazena endereços MAC, conhecidos,
por exemplo, nos endereços de hardware dos adaptadores de rede
Ethernet (embora o endereço MAC seja usado para outras finalidades
também). A entrada é aceita nos seguintes 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 esses exemplos especificam o mesmo endereço.
São aceitas letras maiúsculas e minúsculas para os dígitos de
a a f.
A saída é sempre na primeira forma mostrada acima.
O padrão IEEE 802-2001 especifica a segunda forma mostrada acima
(com hifens) como forma canônica para o endereço MAC, e especifica
a primeira forma (com dois pontos) como usada com
bit-reversed, notação MSB-first,
tal que 08-00-2b-01-02-03 = 10:00:D4:80:40:C0.
Essa convenção é amplamente ignorada hoje em dia, relevante
apenas para protocolos de rede obsoletos
(como Token Ring).
O PostgreSQL não faz provisões para
bit-reversed; todos os formatos aceitos usam a
ordem LSB canônica.
Os últimos cinco formatos de entrada mostrados acima não fazem parte de nenhum padrão.
O tipo de dados macaddr8 armazena endereços MAC no formato
EUI-64, conhecidos, por exemplo, nos endereços de hardware dos
adaptadores de rede Ethernet (embora o endereço MAC seja usado para
outras finalidades também).
Esse tipo de dados pode aceitar endereços MAC de comprimento de 6 e 8 bytes,
e os armazena no formato de comprimento de 8 bytes.
Os endereços MAC fornecidos no formato de 6 bytes são armazenados
no formato de comprimento de 8 bytes, com o 4º e o 5º bytes
definidos como FF e FE, respectivamente.
Note que o IPv6 usa um formato EUI-64 modificado, onde o 7º bit
deve ser definido como 1 após a conversão de EUI-48.
A função macaddr8_set7bit é fornecida para
fazer essa alteração.
De modo geral, qualquer entrada composta por pares de dígitos
hexadecimais (em fronteiras de byte), opcionalmente separados de
forma consistente por ':',
'-' ou '.', é aceita.
O número de dígitos hexadecimais deve ser 16 (8 bytes) ou
12 (6 bytes).
Os espaços em branco à esquerda e à direita são ignorados.
A seguir estão mostrados exemplos de formatos de entrada aceitos:
'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' |
Todos esses exemplos especificam o mesmo endereço.
São aceitas maiúsculas e minúsculas para os dígitos de
a a f.
A saída é sempre na primeira forma mostrada acima.
Os últimos seis formatos de entrada mostrados acima não fazem parte de nenhum padrão.
Para converter um endereço MAC tradicional de 48 bits no formato
EUI-48 para o formato EUI-64 modificado, para ser incluído como a
porção do hospedeiro de um endereço IPv6, deve ser usada a função
macaddr8_set7bit
(veja a Seção 9.12), conforme mostrado abaixo:
SELECT macaddr8_set7bit('08:00:2b:01:02:03');
macaddr8_set7bit
-------------------------
0a:00:2b:ff:fe:01:02:03
(1 linha)