sql >> Database >  >> RDS >> Oracle

Vertegenwoordigen van IPv4/IPv6-adressen in Oracle

Wat is in Oracle het juiste gegevenstype of de juiste techniek om netwerkadressen weer te geven, welke adressen IPv4 of IPv6 kunnen zijn

Er zijn twee benaderingen:

  1. alleen opslaan.
  2. de conventionele weergave opslaan

Alleen voor opslag. Een IPV4-adres moet een geheel getal zijn (32 bits is voldoende). Voor IP V6, 128 bits, is INTEGER (vergelijkbaar met nummer (38)) voldoende. Dat is natuurlijk opbergen. Die benadering gaat ervan uit dat de weergave een zaak is voor de toepassing.

Als men de tegenovergestelde strategie kiest, namelijk het opslaan van de conventionele representatie, moet men ervoor zorgen dat IP V4- en IPV6-adressen slechts één conventionele (string) representatie hebben. Het staat bekend om ipV4. Voor IPV6 is er ook een standaardformaat.

Mijn voorkeur gaat uit naar de eerste strategie. In het ergste geval kunt u een hybride benadering aannemen (niet-zuur) en zowel de binaire als de ascii-representatie naast elkaar opslaan met "prioriteit" voor de binaire waarde.

Geen enkele rij bevat echter zowel v4- als v6-adressen.

De standaardweergave van een IPV4-adres in IPV6-formaat is:::ffff:192.0.2.128 .

Ik ken de context niet, maar ik zou echter 2 kolommen reserveren, een voor IPV4 en de andere voor een apart ipV6-adres.

Bijwerken
Na een goede opmerking van @sleepyMonad's wil ik u erop wijzen dat in plaats van het nummer gegevenstype het verdient de voorkeur om het gegevenstype INTEGER te gebruiken, dat graag de hoogst mogelijke waarde accommodeert die kan worden uitgedrukt met een 128-bits geheel getal 'ff...ff' (waarvoor 39 nodig is decimale cijfers). 38 is de hoogste macht van tien van 0 tot 9 die kan worden gecodeerd op 128 bits, maar men kan nog steeds de maximale niet-ondertekende waarde invoegen voor 2**128 - 1 (decimaal 340282366920938463463374607431768211455). Hier is een kleine test om deze mogelijkheid te illustreren.

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


  1. Hoe kan ik de PostgreSQL-server starten op Mac OS X?

  2. Meest efficiënte manier om rijen in de MySQL-database in te voegen

  3. Oracle-database gebruiken met CakePHP 2.0

  4. Waarschuwing:mysql_connect():[2002] Geen dergelijk bestand of map (probeert verbinding te maken via unix:///tmp/mysql.sock) in