sql >> Base de Datos >  >> RDS >> Oracle

Representación de direcciones IPv4/IPv6 en Oracle

En Oracle, ¿cuál es el tipo de datos o la técnica adecuada para representar las direcciones de red, que pueden ser IPv4 o IPv6?

Hay dos enfoques:

  1. solo almacenamiento.
  2. almacenar la representación convencional

Solo para almacenar. Una dirección IPV4 debe ser un número entero (32 bits son suficientes). Para IP V6, 128 bits, INTEGER (que es similar a Number(38)) servirá. Por supuesto, eso es almacenar. Ese enfoque considera que la representación es un asunto de la aplicación.

Si se toma la estrategia opuesta, de almacenar la representación convencional, es necesario asegurarse de que las direcciones IP V4 e IPV6 tengan solo una representación convencional (cadena). Es bien conocido por ipV4. En cuanto a IPV6, también existe un formato estándar.

Mi preferencia va a la primera estrategia. En el peor de los casos, puede adoptar un enfoque híbrido (aunque no ácido) y almacenar tanto la representación binaria como la ascii una al lado de la otra con "prioridad" para el valor binario.

Sin embargo, ninguna fila contiene direcciones v4 y v6.

La representación estándar de una dirección IPV4 en formato IPV6 es:::ffff:192.0.2.128 .

No conozco el contexto pero, sin embargo, reservaría 2 columnas, una para IPV4 y la otra para una dirección ipV6 distinta.

Actualizar
Después de un buen comentario de @sleepyMonad, me gustaría señalar que en lugar del Número tipo de datos es preferible utilizar el tipo de datos INTEGER, que felizmente acomodará el valor más alto posible que se puede expresar con un entero de 128 bits 'ff...ff' (que necesitaría 39 dígitos decimales). 38 es la potencia más alta de diez varía de 0 a 9 que se puede codificar en 128 bits, pero aún se puede insertar el valor máximo sin firmar para 2**128 - 1 (decimal 340282366920938463463374607431768211455). Aquí hay una pequeña prueba para ilustrar esta posibilidad.

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