Oracle
 sql >> Database >  >> RDS >> Oracle

Rappresentazione di indirizzi IPv4/IPv6 in Oracle

In Oracle, qual è il tipo di dati o la tecnica appropriati per rappresentare gli indirizzi di rete, quali indirizzi possono essere IPv4 o IPv6?

Ci sono due approcci:

  1. solo archiviazione.
  2. memorizzare la rappresentazione convenzionale

Solo per la conservazione. Un indirizzo IPV4 dovrebbe essere un numero intero (32 bit sono sufficienti). Per IP V6, 128 bit, INTEGER (che è simile a Number(38)) andrà bene. Naturalmente, questo è l'archiviazione. Tale approccio ritiene che la rappresentanza rientri nell'ambito della domanda.

Se si adotta la strategia opposta, quella di memorizzare la rappresentazione convenzionale, è necessario assicurarsi che gli indirizzi IP V4 e IPV6 abbiano solo una rappresentazione convenzionale (stringa). È noto per ipV4. Come per IPV6, esiste anche un formato standard.

La mia preferenza va alla prima strategia. Nel peggiore dei casi, puoi adottare un approccio ibrido (anche se non acido) e memorizzare sia la rappresentazione binaria che quella ascii fianco a fianco con "priorità" al valore binario.

Tuttavia, nessuna riga contiene indirizzi v4 e v6.

La rappresentazione standard di un indirizzo IPV4 in formato IPV6 è:::ffff:192.0.2.128 .

Non conosco il contesto ma mi riserverei comunque 2 colonne, una per IPV4 e l'altra per un indirizzo ipV6 distinto.

Aggiorna
Dopo un buon commento di @sleepyMonad, vorrei sottolineare che invece del Numero tipo di dati è preferibile utilizzare il tipo di dati INTEGER, che ospiterà felicemente il valore più alto possibile che può essere espresso con un intero a 128 bit 'ff...ff' (che richiederebbe 39 cifre decimali). 38 è la potenza massima di dieci che va da 0 a 9 che può essere codificato su 128 bit ma si può comunque inserire il valore massimo senza segno per 2**128 - 1 (decimale 340282366920938463463374607431768211455). Ecco un piccolo test per illustrare questa 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