W Oracle, jaki jest odpowiedni typ danych lub technika przedstawiania adresów sieciowych, których adresami może być IPv4 lub IPv6
Istnieją dwa podejścia:
- tylko przechowywanie.
- przechowywanie konwencjonalnej reprezentacji
Tylko do przechowywania. Adres IPV4 powinien być liczbą całkowitą (wystarczą 32 bity). Dla IP V6, 128 bitów, wystarczy INTEGER (podobny do Number(38)). Oczywiście to przechowywanie. Takie podejście zakłada, że przedstawienie jest kwestią wniosku.
Jeśli przyjąć odwrotną strategię, polegającą na przechowywaniu konwencjonalnej reprezentacji, należy upewnić się, że adresy IP V4 i IPV6 mają tylko jedną konwencjonalną reprezentację (łańcuch). Jest dobrze znany z ipV4. Jeśli chodzi o IPV6, istnieje również standardowy format.
Preferuję pierwszą strategię. W najgorszym przypadku można zastosować podejście hybrydowe (choć nie kwasowe) i przechowywać zarówno reprezentację binarną, jak i ascii obok wartości „priorytet” względem wartości binarnej.
Żaden wiersz nie zawiera jednak adresów v4 i v6.
Standardowa reprezentacja adresu IPV4 w formacie IPV6 to:::ffff:192.0.2.128
.
Nie znam kontekstu, ale zarezerwowałbym 2 kolumny, jedną dla IPV4, a drugą dla odrębnego adresu IPV6.
Aktualizacja
Po dobrym komentarzu @sleepyMonad chciałbym zaznaczyć, że zamiast Liczby typ danych lepiej jest użyć typu danych INTEGER, który z radością pomieści najwyższą możliwą wartość, którą można wyrazić za pomocą 128-bitowej liczby całkowitej 'ff...ff' (co wymagałoby 39 cyfry dziesiętne). 38 to najwyższa potęga dziesięciu od 0 do 9 które można zakodować na 128 bitach, ale nadal można wstawić maksymalną wartość bez znaku dla 2**128 - 1 (dziesiętnie 340282366920938463463374607431768211455). Oto mały test ilustrujący tę możliwość.
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