Oracle
 sql >> Base de données >  >> RDS >> Oracle

Représentation des adresses IPv4/IPv6 dans Oracle

Dans Oracle, quel est le type de données ou la technique appropriée pour représenter les adresses réseau, lesquelles adresses peuvent être IPv4 ou IPv6

Il existe deux approches :

  1. stockage uniquement.
  2. stocker la représentation conventionnelle

Pour le stockage uniquement. Une adresse IPV4 doit être un entier (32 bits suffisent). Pour IP V6, 128 bits, INTEGER (qui est similaire à Number(38)) fera l'affaire. Bien sûr, c'est le stockage. Cette approche part du principe que la représentation relève de l'application.

Si l'on prend la stratégie inverse, consistant à stocker la représentation conventionnelle, il faut s'assurer que les adresses IP V4 et IPV6 n'ont qu'une seule représentation conventionnelle (chaîne). Il est bien connu pour ipV4. Comme pour IPV6, il existe également un format standard.

Ma préférence va à la première stratégie. Dans le pire des cas, vous pouvez adopter une approche hybride (mais non acide) et stocker à la fois la représentation binaire et ascii côte à côte avec la "priorité" à la valeur binaire.

Cependant, aucune ligne ne contient à la fois les adresses v4 et v6.

La représentation standard d'une adresse IPV4 au format IPV6 est :::ffff:192.0.2.128 .

Je ne connais pas le contexte mais je réserverais cependant 2 colonnes, une pour l'IPV4 et l'autre pour une adresse ipV6 distincte.

Mettre à jour
Suite à un bon commentaire de @sleepyMonad's, j'aimerais préciser qu'au lieu du Numéro type de données, il est préférable d'utiliser le type de données INTEGER, qui acceptera volontiers la valeur la plus élevée possible pouvant être exprimée avec un entier de 128 bits 'ff...ff' (ce qui nécessiterait 39 chiffres décimaux). 38 est la puissance la plus élevée de dix allant de 0 à 9 qui peut être encodé sur 128 bits mais on peut toujours insérer la valeur maximale non signée pour 2**128 - 1 (décimal 340282366920938463463374607431768211455). Voici un petit test pour illustrer cette possibilité.

create table test (
  id integer primary key,
  ipv6_address_bin INTEGER );

-- Let's enter 2**128 - 1 in the nueric field
insert into test (id, ipv6_address_bin) values ( 1, to_number ( 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') ) ;

-- retrieve it to make sure it's not "truncated".
select to_char ( ipv6_address_bin, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ) from test where id = 1 ;
-- yields 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'

select to_char ( ipv6_address_bin ) from test where id = 1 ;
-- yields 340282366920938463463374607431768211455

select LOG(2, ipv6_address_bin) from test where id = 1 ;
-- yields 128

select LOG(10, ipv6_address_bin) from test where id = 1 ;
-- yields > 38