Oracleでは、ネットワークアドレスを表すための適切なデータタイプまたは手法は何ですか。どのアドレスはIPv4またはIPv6である可能性があります
2つのアプローチがあります:
- 保存のみ。
- 従来の表現を保存する
保存専用です。 IPV4アドレスは整数である必要があります(32ビットで十分です)。 IP V6、128ビットの場合、INTEGER(Number(38)に類似)が機能します。もちろん、それは保存です。そのアプローチは、表現がアプリケーションの問題であるという見方をします。
従来の表現を保存するという反対の戦略をとる場合は、IP V4アドレスとIPV6アドレスに従来の(文字列)表現が1つしかないことを確認する必要があります。 ipV4でよく知られています。 IPV6については、標準形式もあります。
私の好みは最初の戦略に行きます。最悪の場合、ハイブリッドアプローチ(ただし非酸性)を採用し、バイナリとASCII表現の両方をバイナリ値の「優先度」と並べて保存できます。
ただし、v4アドレスとv6アドレスの両方を含む行はありません。
IPV6形式のIPV4アドレスの標準表現は次のとおりです。::ffff:192.0.2.128
。
コンテキストはわかりませんが、2つの列を予約します。1つはIPV4用で、もう1つは個別のipV6アドレス用です。
更新
@sleepyMonadの良いコメントに続いて、番号の代わりにそれを指摘したいと思います。 データ型は、128ビット整数'ff ... ff'( 39 が必要)で表現できる可能な限り高い値に対応できるINTEGERデータ型を使用することをお勧めします。 10進数)。 38は、0から9までの範囲の10の最大の累乗です これは128ビットでエンコードできますが、 2 ** 128-1の最大符号なし値を挿入できます。 (10進数の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