sql >> データベース >  >> RDS >> Oracle

OracleでのIPv4/IPv6アドレスの表現

    Oracleでは、ネットワークアドレスを表すための適切なデータタイプまたは手法は何ですか。どのアドレスはIPv4またはIPv6である可能性があります

    2つのアプローチがあります:

    1. 保存のみ。
    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
    


    1. OracleからSQLServerへの画像の挿入

    2. AndroidのリストビューアイテムをクリックしてデータベースからIDを取得する方法

    3. 生命保険データモデル

    4. bash変数使用時のSqlplusログインエラー:SP2-0306:無効なオプション