Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Representando endereços IPv4/IPv6 no Oracle


No Oracle, qual é o tipo de dado ou técnica apropriada para representar os endereços de rede, que podem ser IPv4 ou IPv6

Existem duas abordagens:
  1. somente armazenamento.
  2. armazenando a representação convencional

Apenas para armazenamento. Um endereço IPV4 deve ser um inteiro (32 bits são suficientes). Para IP V6, 128 bits, INTEGER (que é semelhante a Number(38)) serve. Claro, isso é armazenar. Essa abordagem considera que a representação é uma questão para a aplicação.

Se tomarmos a estratégia oposta, de armazenar a representação convencional, é preciso certificar-se de que os endereços IP V4 e IPV6 tenham apenas uma representação convencional (string). É bem conhecido por ipV4. Quanto ao IPV6, também existe um formato padrão.

Minha preferência vai para a primeira estratégia. Na pior das hipóteses, você pode adotar uma abordagem híbrida (embora não ácida) e armazenar a representação binária e ascii lado a lado com "prioridade" para o valor binário.

No entanto, nenhuma linha contém os endereços v4 e v6.

A representação padrão de um endereço IPV4 no formato IPV6 é:::ffff:192.0.2.128 .

Não conheço o contexto, mas reservaria 2 colunas, uma para IPV4 e outra para um endereço ipV6 distinto.

Atualizar
Após um bom comentário de @sleepyMonad, gostaria de salientar que em vez do Número tipo de dados é preferível usar o tipo de dados INTEGER, que acomodará o valor mais alto possível que pode ser expresso com um inteiro de 128 bits 'ff...ff' (que precisaria de 39 dígitos decimais). 38 é a maior potência de dez variando de 0 a 9 que pode ser codificado em 128 bits, mas ainda é possível inserir o valor máximo sem sinal para 2**128 - 1 (decimal 340282366920938463463374607431768211455). Aqui está um pequeno teste para ilustrar essa possibilidade.
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