sql >> Databáze >  >> RDS >> Oracle

Zastupování adres IPv4/IPv6 v Oracle

V Oracle, jaký je vhodný typ dat nebo technika pro reprezentaci síťových adres, které mohou být IPv4 nebo IPv6

Existují dva přístupy:

  1. pouze ukládání.
  2. uložení konvenční reprezentace

Pouze pro uložení. Adresa IPV4 by měla být celé číslo (stačí 32 bitů). Pro IP V6, 128 bitů, bude stačit INTEGER (což je podobné jako Number(38)). Samozřejmě je to ukládání. Tento přístup zastává názor, že zastoupení je záležitostí aplikace.

Pokud zvolíme opačnou strategii, tedy uložení konvenční reprezentace, musíme se ujistit, že adresy IP V4 a IPV6 mají pouze jednu konvenční (řetězcovou) reprezentaci. Je dobře známý pro ipV4. Pokud jde o IPV6, existuje také standardní formát.

Dávám přednost první strategii. V nejhorším případě můžete použít hybridní přístup (i když ne kyselý) a uložit binární i ascii reprezentaci vedle sebe s "prioritou" binární hodnoty.

Žádný řádek však neobsahuje adresy v4 i v6.

Standardní reprezentace adresy IPV4 ve formátu IPV6 je:::ffff:192.0.2.128 .

Neznám kontext, ale vyhradil bych si 2 sloupce, jeden pro IPV4 a druhý pro odlišnou adresu IPV6.

Aktualizovat
Po dobrém komentáři od @sleepyMonad's bych rád zdůraznil, že místo Čísla datový typ je vhodnější použít datový typ INTEGER, který šťastně pojme nejvyšší možnou hodnotu, kterou lze vyjádřit 128bitovým celým číslem 'ff...ff' (což by potřebovalo 39 desetinné číslice). 38 je nejvyšší mocnina deseti v rozsahu od 0 do 9 které lze zakódovat na 128 bitů, ale stále lze vložit maximální hodnotu bez znaménka pro 2**128 - 1 (desítkové 340282366920938463463374607431768211455). Zde je malý test pro ilustraci této možnosti.

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. Podmíněné pořadí podle

  2. Jak procházet seznamem s oddělovači v Oracle PLSQL

  3. Více řádků na jednu hodnotu oddělenou čárkami na serveru SQL Server

  4. Jak uložit více možností do jedné tabulky?