Topik ini menjelaskan latar belakang, tipe data, dan penggunaan ekstensi ip4r.
Penerapan
Versi berikut dari PolarDB for PostgreSQL didukung:
PostgreSQL 17 (versi mesin minor 2.0.17.6.4.0 atau yang lebih baru)
PostgreSQL 16 (versi mesin minor 2.0.16.9.9.0 atau lebih baru)
PostgreSQL 15 (versi mesin minor 2.0.15.14.6.0 atau yang lebih baru)
PostgreSQL 14 (versi mesin minor 2.0.14.9.13.0 atau lebih baru)
PostgreSQL 11 (versi mesin minor 2.0.11.9.36.0 atau lebih baru)
Anda dapat melihat versi mesin minor di console atau dengan menjalankan pernyataan SHOW polardb_version;. Jika versi mesin minor Anda tidak memenuhi persyaratan, upgrade the minor engine version.
Informasi latar belakang
ip4r adalah ekstensi pihak ketiga yang didukung oleh PolarDB for PostgreSQL dan . Ekstensi ini menyediakan tipe data untuk menyimpan alamat IPv4 dan IPv6. Berbeda dengan tipe data bawaan inet dan cidr di PostgreSQL, ip4r mendukung Pemindaian indeks untuk operator contains >>=. Selain itu, ip4r memiliki keunggulan berikut dibandingkan tipe data jaringan bawaan PostgreSQL:
Semantik yang lebih jelas: membedakan antara blok jaringan dan alamat IP spesifik dalam blok jaringan.
Overhead lebih rendah: PostgreSQL menggunakan tipe data variabel-panjang untuk menyimpan data IPv6, yang menimbulkan overhead signifikan saat hanya menyimpan data IPv4. Sebaliknya,
ip4rmenggunakan tipe data panjang tetap untuk alamat tunggal.
Tipe data
ip4r menyediakan berbagai tipe data untuk menyimpan dan merepresentasikan data IPv4 atau IPv6:
Tipe data | Deskripsi |
ip4 | Alamat IPv4 tunggal. |
ip4r | Rentang alamat IPv4 arbitrer. |
ip6 | Alamat IPv6 tunggal. |
ip6r | Rentang alamat IPv6 arbitrer. |
ipaddress | Alamat IPv4 atau IPv6 tunggal. |
iprange | Rentang alamat IPv4 atau IPv6 arbitrer. |
Tipe data alamat tunggal dan konversi tipe
Tiga tipe data berikut digunakan untuk menyimpan alamat IP tunggal:
ip4: menerima input dalam formatnnn.nnn.nnn.nnn. Data disimpan sebagai bilangan bulat tak bertanda 32-bit.ip6: menerima input dalam format heksadesimal standar untuk alamat IPv6. Data disimpan sebagai dua nilai 64-bit.ipaddress: menerima input dalam formatip4atauip6.
Untuk ketiga tipe data tersebut, ip4r menyediakan aturan konversi tipe berikut:
Pada tabel berikut, ipX merepresentasikan salah satu dari tiga tipe data yang dijelaskan di atas.
Tipe sumber | Tipe tujuan | Format |
ipX | text | text(ipX) atau ipX::text (eksplisit) |
text | ipX | ipX(text) atau text::ipX (eksplisit) |
ipX | cidr | cidr(ipX) atau ipX::cidr (penugasan) |
inet | ipX | ipX(inet) atau inet::ipX (penugasan) |
ipX | numeric | to_numeric(ipX) atau ipX::numeric (eksplisit) |
numeric | ipX | ipX(numeric) atau bigint::ipX (eksplisit) |
ip4 | bigint | to_bigint(ip4) atau ip4::bigint (eksplisit) |
bigint | ip4 | ip4(bigint) atau bigint::ip4 (eksplisit) |
ip4 | float8 | to_double(ip4) atau ip4::float8 (eksplisit) |
float8 | ip4 | ip4(float8) atau float8::ip4 (eksplisit) |
ipX | varbit | to_bit(ipX) atau ipX::varbit (eksplisit) |
bit(32) | ip4 | ip4(bit) atau bit::ip4 (eksplisit) |
bit(128) | ip6 | ip6(bit) atau bit::ip6 (eksplisit) |
varbit | ipX | ipX(varbit) atau varbit::ipX (eksplisit) |
ipX | bytea | to_bytea(ipX) atau ipX::bytea (eksplisit) |
bytea | ipX | ipX(bytea) atau bytea::ipX (eksplisit) |
ipX | ipXr | ipXr(ipX) atau ipX::ipXr (implisit) |
ip4 | ipaddress | ipaddress(ip4) atau ip4::ipaddress (implisit) |
ip6 | ipaddress | ipaddress(ip6) atau ip6::ipaddress (implisit) |
ipaddress | ip4 | ip4(ipaddress) atau ipaddress::ip4 (penugasan) |
ipaddress | ip6 | ip6(ipaddress) atau ipaddress::ip6 (penugasan) |
Tipe data rentang alamat dan konversi tipe
Tiga tipe data berikut digunakan untuk menyimpan rentang alamat IP:
ip4r: menyimpan rentang alamat IPv4. Contohnya,192.0.2.100-192.0.2.200. Rentang192.0.2.0/24setara dengan192.0.2.0-192.0.2.255.ip6r: menyimpan rentang alamat IPv6. Contohnya,2001::1234-2001::2000:0000. Rentang2001::/112setara dengan2001::-2001::ffff.iprange: menerima input dalam formatip4ratauip6r.
Untuk ketiga tipe data tersebut, ip4r menyediakan aturan konversi tipe berikut:
Pada tabel berikut, ipXr merepresentasikan salah satu dari tiga tipe data yang dijelaskan di atas.
Tipe sumber | Tipe tujuan | Format |
ipX | ipXr | ipXr(ipX) atau ipX::ipXr (implisit) |
ipXr | text | text(ipXr) atau ipXr::text (eksplisit) |
text | ipXr | ipXr(text) atau text::ipXr (eksplisit) |
ipXr | cidr | cidr(ipXr) atau ipXr::cidr (eksplisit) |
cidr | ipXr | ipXr(cidr) atau cidr::ipXr (penugasan) |
ipXr | varbit | to_bit(ipXr) atau ipXr::varbit (eksplisit) |
varbit | ip4r | ip4r(varbit) atau varbit::ip4r (eksplisit) |
varbit | ip6r | ip6r(varbit) atau varbit::ip6r (eksplisit) |
Penggunaan
Buat ekstensi
CREATE EXTENSION ip4r;Buat tabel uji dan impor data
CREATE TABLE ipranges (r iprange, r4 ip4r, r6 ip6r);
INSERT INTO ipranges
SELECT r, null, r
FROM (
SELECT ip6r(regexp_replace(ls, E'(....(?!$))', E'\\1:', 'g')::ip6,
regexp_replace(substring(ls FOR n + 1) || substring(us FROM n + 2),
E'(....(?!$))', E'\\1:', 'g')::ip6) AS r
FROM (
SELECT md5(i || ' lower 1') AS ls,
md5(i || ' upper 1') AS us,
(i % 11) + (i/11 % 11) + (i/121 % 11) AS n
FROM generate_series(1,13310) i) s1) s2;Buat indeks GiST
CREATE INDEX ipranges_r ON ipranges USING gist (r);Gunakan operator contains
EXPLAIN (COSTS OFF) SELECT * FROM ipranges WHERE r >>= '5555::' ORDER BY r;Hasil berikut dikembalikan:
QUERY PLAN
-----------------------------------------------------
Sort
Sort Key: r
-> Bitmap Heap Scan on ipranges
Recheck Cond: (r >>= '5555::'::iprange)
-> Bitmap Index Scan on ipranges_r
Index Cond: (r >>= '5555::'::iprange)
(6 rows)Hapus ekstensi
DROP EXTENSION ip4r;