ip4r
PostgreSQL 的 IPv4/v6 和 IPv4/v6 范围索引类型
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
ip4r | 2.4.2 | TYPE | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3820 | ip4r | 否 | 是 | 否 | 是 | 否 | 是 | - |
| 相关扩展 | pg_net prefix semver unit pgpdf pglite_fusion md5hash asn1oid |
|---|---|
| 下游依赖 | geoip |
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 2.4.2 | 1817161514 | ip4r | - |
| RPM | PGDG | 2.4.2 | 1817161514 | ip4r_$v | - |
| DEB | PGDG | 2.4.2 | 1817161514 | postgresql-$v-ip4r | - |
安装
您可以直接安装 ip4r 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
pig repo add pgdg -u # 添加 PGDG 仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install ip4r; # 当前活跃 PG 版本安装
pig ext install -y ip4r -v 18 # PG 18
pig ext install -y ip4r -v 17 # PG 17
pig ext install -y ip4r -v 16 # PG 16
pig ext install -y ip4r -v 15 # PG 15
pig ext install -y ip4r -v 14 # PG 14
dnf install -y ip4r_18 # PG 18
dnf install -y ip4r_17 # PG 17
dnf install -y ip4r_16 # PG 16
dnf install -y ip4r_15 # PG 15
dnf install -y ip4r_14 # PG 14
apt install -y postgresql-18-ip4r # PG 18
apt install -y postgresql-17-ip4r # PG 17
apt install -y postgresql-16-ip4r # PG 16
apt install -y postgresql-15-ip4r # PG 15
apt install -y postgresql-14-ip4r # PG 14
创建扩展:
CREATE EXTENSION ip4r;
用法
ip4r 扩展提供了专用的 IPv4/IPv6 地址和范围数据类型,具有优秀的包含查询索引支持。
CREATE EXTENSION ip4r;
数据类型
| 类型 | 描述 |
|---|---|
ip4 | 单个 IPv4 地址(32 位) |
ip6 | 单个 IPv6 地址(双 64 位) |
ip4r | IPv4 地址范围 |
ip6r | IPv6 地址范围 |
ipaddress | 混合 IPv4/IPv6 地址 |
iprange | 混合 IPv4/IPv6 范围 |
地址输入
SELECT '192.168.1.1'::ip4;
SELECT '2001:db8::1'::ip6;
SELECT '10.0.0.0/24'::ip4r; -- CIDR 表示法
SELECT '192.168.1.100-192.168.1.200'::ip4r; -- 显式范围
地址运算符
- 比较:
=、<>、<、>、<=、>= - 算术:
+、-(与整数运算) - 位运算:
&(AND)、|(OR)、#(XOR)、~(NOT)
地址函数
SELECT family('192.168.1.1'::ipaddress); -- 4
SELECT ip4_netmask(24); -- 255.255.255.0
范围运算符
| 运算符 | 描述 |
|---|---|
>>= | 包含或等于 |
>> | 严格包含 |
<<= | 被包含或等于 |
<< | 严格被包含 |
&& | 重叠 |
范围函数
SELECT lower('10.0.0.0/24'::ip4r); -- 10.0.0.0
SELECT upper('10.0.0.0/24'::ip4r); -- 10.0.0.255
SELECT is_cidr('10.0.0.0/24'::ip4r); -- true
SELECT cidr_split('10.0.0.0-10.0.0.5'::ip4r); -- 分解为 CIDR
SELECT @ '10.0.0.0/24'::ip4r; -- 近似大小
索引
-- 用于包含查询的 GiST 索引
CREATE INDEX idx ON ipranges USING gist (range);
-- 查找包含特定 IP 的范围
SELECT * FROM ipranges WHERE range >>= '10.0.1.15'::ip4;
-- 查找最精确匹配
SELECT * FROM ipranges
WHERE range >>= '10.0.1.15'::ip4
ORDER BY @ range LIMIT 1;