Di Oracle, jenis atau teknik data apa yang sesuai untuk mewakili alamat jaringan, yang alamatnya mungkin IPv4 atau IPv6
Ada dua pendekatan :
- hanya untuk menyimpan.
- menyimpan representasi konvensional
Untuk penyimpanan saja. Alamat IPV4 harus berupa bilangan bulat (cukup 32 bit). Untuk IP V6, 128 bit, INTEGER (yang mirip dengan Number(38)) bisa digunakan. Tentu saja, itu menyimpan. Pendekatan tersebut mengambil pandangan bahwa representasi adalah masalah aplikasi.
Jika seseorang mengambil strategi yang berlawanan, menyimpan representasi konvensional, kita perlu memastikan bahwa alamat IP V4 dan IPv6 hanya memiliki satu representasi konvensional (string). Ini terkenal dengan ipV4. Sedangkan untuk IPV6, ada juga format standar.
Preferensi saya pergi ke strategi pertama. Dalam kasus terburuk, Anda dapat mengadopsi pendekatan hibrida (meskipun non asam) dan menyimpan representasi biner dan ascii berdampingan dengan "prioritas" ke nilai biner.
Namun, tidak ada baris yang berisi alamat v4 dan v6.
Representasi standar dari alamat IPV4 dalam format IPV6 adalah :::ffff:192.0.2.128
.
Saya tidak tahu konteksnya tetapi saya akan memesan 2 kolom, satu untuk IPv4 dan yang lainnya untuk alamat IPv6 yang berbeda.
Perbarui
Mengikuti komentar bagus dari @sleepyMonad, saya ingin menunjukkan bahwa alih-alih Nomor tipe data lebih baik menggunakan tipe data INTEGER, yang akan dengan senang hati mengakomodasi nilai tertinggi yang dapat diekspresikan dengan integer 128 bit 'ff...ff' (yang akan membutuhkan 39 angka desimal). 38 adalah kekuatan tertinggi dari sepuluh mulai dari 0 hingga 9 yang dapat dikodekan pada 128 bit tetapi seseorang masih dapat memasukkan nilai unsigned maksimum untuk 2**128 - 1 (desimal 340282366920938463463374607431768211455). Berikut adalah tes kecil untuk menggambarkan kemungkinan ini.
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