Oracle
 sql >> база данни >  >> RDS >> Oracle

Представяне на IPv4/IPv6 адреси в Oracle

В Oracle какъв е подходящият тип данни или техника за представяне на мрежови адреси, кои адреси могат да бъдат IPv4 или IPv6

Има два подхода:

  1. само съхранение.
  2. съхранение на конвенционалното представяне

Само за съхранение. 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Логически изглед на модела на данни в R12.2

  2. Функция ASIN() в Oracle

  3. Oracle Insert Select с поръчка по

  4. Използване на функцията Oracle to_date за низ от дата с милисекунди

  5. Грешка ORA-12514 след рестартиране на сървъра