sql >> Databasteknik >  >> RDS >> Oracle

Representerar IPv4/IPv6-adresser i Oracle

Vilken är lämplig datatyp eller teknik i Oracle för att representera nätverksadresser, vilka adresser kan vara IPv4 eller IPv6

Det finns två tillvägagångssätt:

  1. endast lagring.
  2. lagra den konventionella representationen

Endast för förvaring. En IPV4-adress bör vara ett heltal (32bitar är tillräckligt). För IP V6, 128 bitar, duger INTEGER (som liknar Number(38)). Det är förstås lagring. Detta synsätt anser att representationen är en fråga för ansökan.

Om man tar den motsatta strategin, att lagra den konventionella representationen, måste man se till att IP V4- och IPV6-adresser endast har en konventionell (sträng)representation. Det är välkänt för ipV4. När det gäller IPV6 finns det också ett standardformat.

Jag föredrar den första strategin. I värsta fall kan du använda en hybrid metod (ej sur dock) och lagra både den binära och ascii-representationen sida vid sida med "prioritet" till det binära värdet.

Ingen rad innehåller dock både v4- och v6-adresser.

Standardrepresentationen av en IPV4-adress i IPV6-format är:::ffff:192.0.2.128 .

Jag vet inte sammanhanget men jag skulle dock reservera 2 kolumner, en för IPV4 och den andra för en distinkt ipV6-adress.

Uppdatera
Efter en bra kommentar av @sleepyMonad's vill jag påpeka att istället för numret datatyp det är att föredra att använda datatypen INTEGER, som gärna kommer att rymma det högsta möjliga värdet som kan uttryckas med ett 128-bitars heltal 'ff...ff' (som skulle behöva 39 decimalsiffror). 38 är den högsta potensen av tio från 0 till 9 som kan kodas på 128 bitar men man kan fortfarande infoga det maximala osignerade värdet för 2**128 - 1 (decimal 340282366920938463463374607431768211455). Här är ett litet test för att illustrera denna möjlighet.

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. SQL, hur man använder SELECT

  2. Returnera tabellprivilegier från en länkad server i SQL Server (T-SQL-exempel)

  3. Beräkna decil från frekvens i MySQL

  4. Hur man infogar en lång sträng i CLOB-datatyp i Oracle