All Products
Search
Document Center

PolarDB:ip4r (penyimpanan alamat jaringan)

Last Updated:Dec 18, 2025

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)

Catatan

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, ip4r menggunakan 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 format nnn.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 format ip4 atau ip6.

Untuk ketiga tipe data tersebut, ip4r menyediakan aturan konversi tipe berikut:

Catatan

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. Rentang 192.0.2.0/24 setara dengan 192.0.2.0-192.0.2.255.

  • ip6r: menyimpan rentang alamat IPv6. Contohnya, 2001::1234-2001::2000:0000. Rentang 2001::/112 setara dengan 2001::-2001::ffff.

  • iprange: menerima input dalam format ip4r atau ip6r.

Untuk ketiga tipe data tersebut, ip4r menyediakan aturan konversi tipe berikut:

Catatan

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;