Zum Inhalt springen

inet-Erweiterung

Die inet-Erweiterung definiert den Datentyp INET zum Speichern von IPv4- und IPv6-Internetadressen. Sie unterstützt die CIDR-Notation für Subnetzmasken (z. B. 198.51.100.0/22, 2001:db8:3c4d::/48).

Installation und Laden

Die inet-Erweiterung wird beim ersten Gebrauch transparent aus dem offiziellen Erweiterungs-Repository automatisch geladen. Wenn Sie sie manuell installieren und laden möchten, führen Sie aus:

INSTALL inet;
LOAD inet;

Beispiele

SELECT '127.0.0.1'::INET AS ipv4, '2001:db8:3c4d::/48'::INET AS ipv6;
ipv4 ipv6
127.0.0.1 2001:db8:3c4d::/48
CREATE TABLE tbl (id INTEGER, ip INET);
INSERT INTO tbl VALUES
(1, '192.168.0.0/16'),
(2, '127.0.0.1'),
(3, '8.8.8.8'),
(4, 'fe80::/10'),
(5, '2001:db8:3c4d:15::1a2f:1a2b');
SELECT * FROM tbl;
id ip
1 192.168.0.0/16
2 127.0.0.1
3 8.8.8.8
4 fe80::/10
5 2001:db8:3c4d:15::1a2f:1a2b

Operationen auf INET-Werten

INET-Werte können natürlich verglichen werden, und IPv4 wird vor IPv6 sortiert. Zusätzlich können IP-Adressen durch Addition oder Subtraktion ganzer Zahlen verändert werden.

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('127.0.0.1'::INET + 10),
('fe80::10'::INET - 9),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b');
SELECT cidr FROM tbl ORDER BY cidr ASC;
cidr
127.0.0.1
127.0.0.11
2001:db8:3c4d:15::1a2f:1a2b
fe80::7

host-Funktion

Die Host-Komponente eines INET-Werts kann mit der Funktion HOST() extrahiert werden.

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.0.0/16'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, host(cidr) AS host FROM tbl;
cidr host
192.168.0.0/16 192.168.0.0
127.0.0.1 127.0.0.1
2001:db8:3c4d:15::1a2f:1a2b/96 2001:db8:3c4d:15::1a2f:1a2b

netmask-Funktion

Berechnet die Netzmaske für das Netzwerk der Adresse.

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, netmask(cidr) AS netmask FROM tbl;
cidr netmask
192.168.1.5/24 255.255.255.0/24
127.0.0.1 255.255.255.255
2001:db8:3c4d:15::1a2f:1a2b/96 ffff:ffff:ffff:ffff:ffff:ffff::/96

network-Funktion

Gibt den Netzwerkteil der Adresse zurück und setzt alles rechts der Netzmaske auf null.

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, network(cidr) AS network FROM tbl;
cidr network
192.168.1.5/24 192.168.1.0/24
127.0.0.1 127.0.0.1
2001:db8:3c4d:15::1a2f:1a2b/96 2001:db8:3c4d:15::/96

broadcast-Funktion

Berechnet die Broadcast-Adresse für das Netzwerk der Adresse.

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.5/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, broadcast(cidr) AS broadcast FROM tbl;
cidr broadcast
192.168.1.5/24 192.168.1.255/24
127.0.0.1 127.0.0.1
2001:db8:3c4d:15::1a2f:1a2b/96 2001:db8:3c4d:15::ffff:ffff/96

Prädikat <<=

Ist das Subnetz im Subnetz enthalten oder gleich?

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.0/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, INET '192.168.1.5/32' <<= cidr AS subnet_contained FROM tbl;
cidr subnet_contained
192.168.1.0/24 true
127.0.0.1 false
2001:db8:3c4d:15::1a2f:1a2b/96 false

Prädikat >>=

Enthält das Subnetz das Subnetz oder ist es gleich?

CREATE TABLE tbl (cidr INET);
INSERT INTO tbl VALUES
('192.168.1.0/24'),
('127.0.0.1'),
('2001:db8:3c4d:15::1a2f:1a2b/96');
SELECT cidr, INET '192.168.0.0/16' >>= cidr AS subnet_contains FROM tbl;
cidr subnet_contains
192.168.1.0/24 true
127.0.0.1 false
2001:db8:3c4d:15::1a2f:1a2b/96 false

HTML-Escape- und Unescape-Funktionen

SELECT html_escape('&');
┌──────────────────┐
│ html_escape('&') │
│ varchar │
├──────────────────┤
│ &amp; │
└──────────────────┘
SELECT html_unescape('&amp;');
┌────────────────────────┐
│ html_unescape('&amp;') │
│ varchar │
├────────────────────────┤
│ & │
└────────────────────────┘