I Oracle, hvad er den passende datatype eller teknik til at repræsentere netværksadresser, hvilke adresser kan være IPv4 eller IPv6
Der er to tilgange:
- kun lagring.
- lagring af den konventionelle repræsentation
Kun til opbevaring. En IPV4-adresse skal være et heltal (32bit er nok). For IP V6, 128 bit, vil INTEGER (som svarer til Number(38)) duer. Det er selvfølgelig opbevaring. Denne tilgang er af den opfattelse, at repræsentationen er et anliggende for ansøgningen.
Hvis man tager den modsatte strategi, at gemme den konventionelle repræsentation, skal man sikre sig, at IP V4- og IPV6-adresser kun har én konventionel (streng)repræsentation. Det er kendt for ipV4. Hvad angår IPV6, er der også et standardformat.
Min præference går til den første strategi. I værste fald kan du anvende en hybrid tilgang (dog ikke syre) og gemme både den binære og ascii-repræsentationen side om side med "prioritet" til den binære værdi.
Ingen række indeholder dog både v4- og v6-adresser.
Standardrepræsentationen af en IPV4-adresse i IPV6-format er:::ffff:192.0.2.128
.
Jeg kender ikke konteksten, men jeg vil dog reservere 2 kolonner, en til IPV4 og den anden til en særskilt ipV6-adresse.
Opdater
Efter en god kommentar fra @sleepyMonad's, vil jeg gerne påpege, at i stedet for Nummeret datatype er det at foretrække at bruge INTEGER-datatypen, som med glæde vil rumme den højest mulige værdi, der kan udtrykkes med et 128 bit heltal 'ff...ff' (hvilket ville kræve 39 decimaltal). 38 er den højeste potens af ti spænder fra 0 til 9 der kan kodes på 128 bit, men man kan stadig indsætte den maksimale usignerede værdi for 2**128 - 1 (decimal 340282366920938463463374607431768211455). Her er en lille test for at illustrere denne mulighed.
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