类型
PostgreSQL 提供的数据类型来存储的 IPv4、IPv6 的地址和MAC地址。这是更好地使用这些类型,而不是纯文本类型存储网络地址,因为这些类型提供输入错误检查和特殊的操作和函数。
| 名称 | 存储长度 | 描述 |
|---|---|---|
| cidr | 7 或 19 bytes | IPv4 和 IPv6 网络 |
| inet | 7 或 19 bytes | IPv4 和 IPv6 hosts 和网络 |
| macaddr | 6 bytes | MAC 地址 |
| macaddr8 | 8 bytes | MAC 地址(EUI-64 格式) |
操作符
| 操作符 | 描述 | 举例 | 结果 |
|---|---|---|---|
| < | 小于 | inet '192.168.1.5' < inet '192.168.1.6' | TRUE |
| <= | 小于等于 | inet '192.168.1.5' <= inet '192.168.1.5' | TRUE |
| = | 等于 | inet '192.168.1.5' = inet '192.168.1.5' | TRUE |
| >= | 大于等于 | inet '192.168.1.5' >= inet '192.168.1.5' | TRUE |
| > | 大于 | inet '192.168.1.5' > inet '192.168.1.4' | TRUE |
| <> | 不等于 | inet '192.168.1.5' <> inet '192.168.1.4' | TRUE |
| << | 被包含 | inet '192.168.1.5' << inet '192.168.1/24' | TRUE |
| <<= | 被包含或等于 | inet '192.168.1/24' <<= inet '192.168.1/24' | TRUE |
| >> | 包含 | inet '192.168.1/24' >> inet '192.168.1.5' | TRUE |
| >>= | 包含或等于 | inet '192.168.1/24' >>= inet '192.168.1/24' | TRUE |
| && | 包含或被包含 | inet '192.168.1/24' && inet '192.168.1.80/28' | TRUE |
| ~ | 按位取反 | ~inet '192.168.1.6' | 63.87.254.249 |
| & | 按位与 | inet '192.168.1.6' & inet '0.0.0.255' | 0.0.0.6 |
| | | 按位或 | inet '192.168.1.6' | inet '0.0.0.255' | 192.168.1.255 |
| + | 加 | inet '192.168.1.6' + 25 | 192.168.1.31 |
| - | 减 | inet '192.168.1.43' - 36 | 192.168.1.7 |
| - | 减 | inet '192.168.1.43' - inet '192.168.1.19' | 24 |
函数
cidr 和 inet 函数
| 函数 | 返回类型 | 描述 | 示例 | 结果 |
|---|---|---|---|---|
| abbrev(inet) | text | 显示为文本格式 | select abbrev(inet '10.1.0.0/16'); | 10.1.0.0/16 |
| abbrev(cidr) | text | 显示为文本格式 | select abbrev(cidr '10.1.0.0/16'); | 10.1/16 |
| broadcast(inet) | inet | 网络广播地址 | select broadcast('192.168.1.5/24'); | 192.168.1.255/24 |
| family(inet) | int | 获取地址族,4位IPv4,6为IPv6 | select family('::1'); | 6 |
| host(inet) | text | 抽取IP地址,并以text显示 | select host('192.168.1.5/24'); | 192.168.1.5 |
| hostmask(inet) | inet | 为网络构造主机掩码 | select hostmask('192.168.23.20/30'); | 0.0.0.3 |
| masklen(inet) | int | 抽取掩码长度 | select masklen('192.168.1.5/24'); | 24 |
| netmask(inet) | inet | 为网络构造子网掩码 | select netmask('192.168.1.5/24'); | 255.255.255.0 |
| network(inet) | cidr | 抽取地址的网络部分 | select network('192.168.1.5/24'); | 192.168.1.0/24 |
| set_masklen(inet, int) | inet | 为inet设置子网掩码长度 | select set_masklen('192.168.1.5/24', 16); | 192.168.1.5/16 |
| set_masklen(cidr, int) | cidr | 为cidr设置子网掩码长度 | select set_masklen('192.168.1.0/24'::cidr, 16); | 192.168.0.0/16 |
| text(inet) | text | 将IP地址和掩码长度抽取为文本 | select text(inet '192.168.1.5'); | 192.168.1.5/32 |
| inet_same_family(inet, inet) | boolean | 是否属于相同的地址族 | select inet_same_family('192.168.1.5/24', '::1'); | f |
| inet_merge(inet, inet) | cidr | 包括两个入参地址的最小网络地址 | select inet_merge('192.168.1.5/24', '192.168.2.5/24'); | 192.168.0.0/22 |
macaddr 函数
| 函数 | 返回类型 | 描述 | 示例 | 结果 |
|---|---|---|---|---|
| trunc(macaddr) | macaddr | 将mac地址后3个字节设置为0 | select trunc(macaddr '12:34:56:78:90:ab'); | 12:34:56:00:00:00 |
macaddr 类型还支持标准关系操作符( > , <= 等)用于词法排序,和按位运算符( ~ , & 和 | )非,与和或。
