PostgreSQL propose des types de données pour stocker des adresses IPv4, IPv6 et MAC. Ceux-ci sont décrits dans le Tableau 8.21. Il est préférable d'utiliser ces types plutôt que des types texte standard pour stocker les adresses réseau, car ils offrent un contrôle de syntaxe lors de la saisie et plusieurs opérateurs et fonctions spécialisés (voir la Section 9.12).
Tableau 8.21. Types d'adresses réseau
Nom | Taille de stockage | Description |
---|---|---|
cidr | 7 ou 19 octets | réseaux IPv4 et IPv6 |
inet | 7 ou 19 octets | hôtes et réseaux IPv4 et IPv6 |
macaddr | 6 octets | adresses MAC |
macaddr8 | 8 bytes | adresses MAC (format EUI-64) |
Lors du tri de données de types inet
ou cidr
,
les adresses IPv4 apparaissent toujours avant les adresses IPv6,
y compris les adresses IPv4 encapsulées, comme
::10.2.3.4 ou ::ffff:10.4.3.2.
inet
Le type inet
stocke une adresse d'hôte IPv4 ou IPv6 et,
optionnellement, son sous-réseau, le tout dans un seul champ. Le
sous-réseau est représenté par le nombre de bits de l'adresse hôte
constituant l'adresse réseau (le « masque réseau »).
Si le masque réseau est 32 et l'adresse de type IPv4,
alors la valeur n'indique pas un sous-réseau, juste un hôte.
En IPv6, la longueur de l'adresse est de 128 bits, si bien que
128 bits définissent une adresse réseau unique. Pour n'accepter que des
adresses réseau, il est préférable
d'utiliser le type cidr
plutôt que le type inet
.
Le format de saisie pour ce type est
adresse/y
où
adresse
est une adresse IPv4 ou IPv6 et
y
est le nombre de bits du masque réseau.
Si y
est omis, alors le masque vaut 32 pour IPv4 et
128 pour IPv6, et la valeur représente un hôte unique.
À l'affichage, la portion
/y
est supprimée si le masque réseau indique un hôte unique.
cidr
Le type cidr
stocke une définition de réseau
IPv4 ou IPv6. La saisie et l'affichage suivent les conventions
Classless Internet Domain Routing.
Le format de saisie d'un réseau est
address/y
où
address
est le réseau représenté sous forme
d'une adresse IPv4 ou IPv6 et
y
est le nombre de bits du masque réseau.
Si y
est omis, il calculé en
utilisant les règles de l'ancien système de classes d'adresses,
à ceci près qu'il est au moins assez grand pour inclure tous
les octets saisis. Saisir une adresse réseau
avec des bits positionnés à droite du masque indiqué est une erreur.
Tableau 8.22 présente quelques exemples.
Tableau 8.22. Exemples de saisie de types cidr
Saisie cidr | Affichage 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 |
::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 différence principale entre les types de données inet
et cidr
réside dans le fait que inet
accepte
des valeurs avec des bits non nuls à droite du masque de réseau, alors
que cidr
ne l'accepte pas. Par exemple,
192.168.0.1/24
est valide pour inet
,
mais pas pour cidr
.
Les fonctions host
, text
et
abbrev
permettent de modifier le format
d'affichage des valeurs inet
et cidr
.
macaddr
Le type macaddr
stocke des adresses MAC, connues par exemple
pour les adresses de cartes réseau Ethernet (mais les adresses MAC sont
aussi utilisées dans d'autres cas). Les saisies sont acceptées dans les
formats suivants :
'08:00:2b:01:02:03' |
'08-00-2b-01-02-03' |
'08002b:010203' |
'08002b-010203' |
'0800-2b01-0203' |
'08002b010203' |
Ces exemples indiquent tous la même adresse. Les majuscules et les
minuscules sont acceptées pour les chiffres a
à
f
. L'affichage se fait toujours selon le premier
des formats ci-dessus.
Le standard IEEE 802-2001 spécifie la seconde forme affichée (avec les tirets) comme forme canonique pour les adresses MAC, et la première forme (avec les :) comme utilisé avec la notation à bits retournés, MSB en premier, ce qui donne l'équivalence 08-00-2b-01-02-03 = 01:00:D4:80:40:C0. Cette convention est largement ignorée aujourd'hui et n'a de sens que pour des protocoles réseau obsolètes (comme Token Ring). PostgreSQL ne tient pas compte des bits retournés ; tous les formats acceptés utilisent l'ordre canonique LSB.
Les cinq derniers formats ne font partie d'aucun standard.
macaddr8
Le type macaddr8
stocke des adresses MAC au format EUI-64,
connu par exemple pour les adresses de cartes réseau Ethernet (mais
les adresses MAC sont aussi utilisées dans d'autres cas).
Ce type accepte à la fois des adresses MAC d'une longueur de six et huit
octets. Les adresses MAC fournies dans un format de six octets seront
stockées dans un format de huit octets avec les quatrième et cinquième octets
respectivement positionnés à FF et FE.
Veuillez noter qu'IPv6 utilise un format modifié de EUI-64 où le septième
bit devrait être positionné à un après la conversion depuis EUI-48. La
fonction macaddr8_set7bit
est fournie pour
réaliser ce changement.
De manière générale, n'importe quelle valeur en entrée constituée de
paires de chiffres au format hexadécimal (dans les limites d'un octet),
systématiquement séparées ou non d'un de ces caractères
':'
, '-'
ou
'.'
est acceptée. Le nombre de chiffres
hexadécimaux doit être 16 (huit octets) ou 12 (six octets). Les
espaces non significatifs présents avant ou après sont ignorés.
Voici un ensemble d'exemples de formats acceptés en entrée :
'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' |
Ces exemples spécifient tous la même adresse. Les majuscules et les
minuscules sont acceptées pour les caractères de
a
jusqu'à f
. La sortie sera
toujours au même format que le premier exemple.
Les six derniers formats en entrée qui sont mentionnés au-dessus ne
font partie d'aucun standard.
Pour convertir une adresse MAC traditionnelle de 48 bits au format
EUI-48 vers le format modifié EUI-64 pour pouvoir être incluse dans la
partie hôte d'une adresse IPv6, utilisez
macaddr8_set7bit
comme ceci :
SELECT macaddr8_set7bit('08:00:2b:01:02:03');
macaddr8_set7bit
-------------------------
0a:00:2b:ff:fe:01:02:03
(1 row)