Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Darstellen von IPv4/IPv6-Adressen in Oracle

Was ist in Oracle der geeignete Datentyp oder die Technik zur Darstellung von Netzwerkadressen, wobei es sich um IPv4- oder IPv6-Adressen handeln kann?

Es gibt zwei Ansätze:

  1. nur speichern.
  2. Speichern der konventionellen Darstellung

Nur zum Aufbewahren. Eine IPV4-Adresse sollte eine Ganzzahl sein (32 Bit reichen aus). Für IP V6 reichen 128 Bit, INTEGER (ähnlich Number(38)). Natürlich ist das Speichern. Dieser Ansatz geht davon aus, dass die Vertretung Sache der Anmeldung ist.

Wenn man die entgegengesetzte Strategie verfolgt, die herkömmliche Darstellung zu speichern, muss man sicherstellen, dass IP-V4- und IPV6-Adressen nur eine herkömmliche (String-)Darstellung haben. Es ist bekannt für ipV4. Auch für IPV6 gibt es ein Standardformat.

Meine Präferenz geht zur ersten Strategie. Im schlimmsten Fall können Sie einen hybriden Ansatz wählen (allerdings keine Säure) und sowohl die Binär- als auch die ASCII-Darstellung nebeneinander mit "Priorität" für den Binärwert speichern.

Keine Zeile enthält jedoch sowohl v4- als auch v6-Adressen.

Die Standarddarstellung einer IPV4-Adresse im IPV6-Format ist:::ffff:192.0.2.128 .

Ich kenne den Kontext nicht, würde aber 2 Spalten reservieren, eine für IPV4 und die andere für eine eindeutige IPV6-Adresse.

Aktualisieren
Nach einem guten Kommentar von @sleepyMonad möchte ich anstelle der Nummer darauf hinweisen Datentyp ist es vorzuziehen, den Datentyp INTEGER zu verwenden, der problemlos den höchstmöglichen Wert aufnehmen kann, der mit einer 128-Bit-Ganzzahl 'ff...ff' ausgedrückt werden kann (was 39 erfordern würde Dezimalziffern). 38 ist die höchste Zehnerpotenz von 0 bis 9 das kann auf 128 Bit codiert werden, aber man kann immer noch den maximalen vorzeichenlosen Wert für 2**128 - 1 einfügen (dezimal 340282366920938463463374607431768211455). Hier ist ein kleiner Test, um diese Möglichkeit zu veranschaulichen.

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