网络地址函数和操作符
inet 可表示主机地址及可选掩码,cidr 表示规范网络;macaddr、macaddr8 则用于硬件地址。以下示例使用 PostgreSQL。不要把 IP 地址存成文本再用字符串前缀判断子网。
地址和子网
SELECT inet '192.168.1.42' << inet '192.168.1.0/24'; -- true
SELECT inet '192.168.1.0/24' >>= inet '192.168.1.42'; -- true
SELECT inet '192.168.1.42' && inet '192.168.1.0/24'; -- true
<< 表示严格包含于网络,<<= 还允许相等;>>、>>= 表示包含对方;&& 表示地址范围重叠。一个主机地址默认是 /32(IPv4)或 /128(IPv6),同一个地址附带不同掩码会影响网络运算。
拆解与修改
SELECT family(inet '2001:db8::1'); -- 6
SELECT masklen(inet '192.168.1.42/24'); -- 24
SELECT host(inet '192.168.1.42/24'); -- 192.168.1.42
SELECT network(inet '192.168.1.42/24'); -- 192.168.1.0/24
SELECT set_masklen(inet '192.168.1.42', 24);
family 返回 4 或 6;host 返回不含掩码的文本,network 归一化到网络地址。broadcast 主要用于 IPv4 广播地址;IPv6 没有相同的广播概念。inet 还支持加减整数以及地址相减,但运算结果必须仍在地址范围内。
使用建议
将授权规则表示为网络包含判断时,确认所用操作符是否允许边界相等。数据输入用类型转换做合法性检查,展示用 host 或 text 转换;性能敏感的网络查询应测试 GiST/SP-GiST 等索引的适用操作符。MAC 地址不是 IP 地址,不能用子网运算处理。