⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
inet 扩展

inet 扩展定义了用于存储 IPv4IPv6 互联网地址的 INET 数据类型。它支持用于子网掩码的 CIDR 表示法(例如,198.51.100.0/222001:db8:3c4d::/48)。

安装和加载

inet 扩展会在首次使用时从官方扩展库中透明地自动加载。如果您想手动安装和加载它,请运行

INSTALL inet;
LOAD inet;

示例

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

INET 值的操作

INET 值可以自然地进行比较,IPv4 会在 IPv6 之前排序。此外,IP 地址可以通过加减整数进行修改。

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 函数

可以使用 HOST() 函数提取 INET 值的主机部分。

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) FROM tbl;
cidr host(cidr)
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 函数

计算地址网络的网络掩码。

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) FROM tbl;
cidr netmask(cidr)
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 函数

返回地址的网络部分,将网络掩码右侧的部分清零。

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) FROM tbl;
cidr network(cidr)
192.168.1.5/24 192.168.1.0/24
127.0.0.1 255.255.255.255
2001:db8:3c4d:15::1a2f:1a2b/96 ffff:ffff:ffff:ffff:ffff:ffff::/96

broadcast 函数

计算地址网络的广播地址。

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) FROM tbl;
cidr broadcast(cidr)
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

<<= 谓词

子网是否包含于或等于另一个子网?

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 FROM tbl;
cidr (CAST('192.168.1.5/32' AS INET) «= cidr)
192.168.1.5/24 true
127.0.0.1 false
2001:db8:3c4d:15::1a2f:1a2b/96 false

>>= 谓词

子网是否包含或等于另一个子网?

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 FROM tbl;
cidr (CAST('192.168.0.0/16' AS INET) »= cidr)
192.168.1.5/24 true
127.0.0.1 false
2001:db8:3c4d:15::1a2f:1a2b/96 false

HTML 转义和反转义函数

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