В Oracle какъв е подходящият тип данни или техника за представяне на мрежови адреси, кои адреси могат да бъдат IPv4 или IPv6
Има два подхода:
- само съхранение.
- съхранение на конвенционалното представяне
Само за съхранение. IPV4 адресът трябва да е цяло число (32 бита са достатъчни). За IP V6, 128 бита, INTEGER (което е подобно на Number(38)) ще свърши работа. Разбира се, това е съхранение. Този подход е на мнение, че представителството е въпрос на приложението.
Ако вземем противоположната стратегия, за съхраняване на конвенционалното представяне, трябва да се уверим, че IP V4 и IPV6 адресите имат само едно конвенционално (низово) представяне. Той е добре известен с ipV4. Що се отнася до IPV6, има и стандартен формат.
Моето предпочитание е към първата стратегия. В най-лошия случай можете да приемете хибриден подход (все пак без киселина) и да съхранявате както двоичното, така и ascii представянето рамо до рамо с „приоритет“ спрямо двоичната стойност.
Нито един ред обаче не съдържа адреси v4 и v6.
Стандартното представяне на IPV4 адрес във формат IPV6 е:::ffff:192.0.2.128
.
Не знам контекста, но бих запазил 2 колони, едната за IPV4, а другата за отделен ipV6 адрес.
Актуализиране
След добър коментар от @sleepyMonad's, бих искал да отбележа, че вместо Числото тип данни е за предпочитане да се използва типът данни INTEGER, който с удоволствие ще побере възможно най-високата стойност, която може да бъде изразена със 128-битово цяло число 'ff...ff' (което ще се нуждае от 39 десетични цифри). 38 е най-високата степен на десетот 0 до 9 който може да бъде кодиран на 128 бита, но все пак може да се вмъкне максималната стойност без знак за 2**128 - 1 (десетичен 340282366920938463463374607431768211455). Ето малък тест, който да илюстрира тази възможност.
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