1. 介绍

1.1 inet 与 cidr的运算

运算符 描述 例子
< is less than inet ‘192.168.1.5’ < inet ‘192.168.1.6’
<= 小于等于 inet ‘192.168.1.5’ <= inet ‘192.168.1.5’
= 等于 inet ‘192.168.1.5’ = inet ‘192.168.1.5’
>= 大于等于 inet ‘192.168.1.5’ >= inet ‘192.168.1.5’
> 大于 inet ‘192.168.1.5’ > inet ‘192.168.1.4’
<> 不等于 inet ‘192.168.1.5’ <> inet ‘192.168.1.4’
<< 包含在内 inet ‘192.168.1.5’ << inet ‘192.168.1/24’
<<= 被包含内或等于 inet ‘192.168.1/24’ <<= inet ‘192.168.1/24’
>> 包含 inet ‘192.168.1/24’ >> inet ‘192.168.1.5’
>>= 包含或等于 inet ‘192.168.1/24’ >>= inet ‘192.168.1/24’
~ 按位非 ~ inet ‘192.168.1.6’
& 按位与 inet ‘192.168.1.6’ & inet ‘0.0.0.255’
| 按位或 inet ‘192.168.1.6’| inet ‘0.0.0.255’
+ 加法 inet ‘192.168.1.6’ + 25
- 减法(与整数) inet ‘192.168.1.43’ - 36
- 减法(与inet类型) inet ‘192.168.1.43’ - inet ‘192.168.1.19’

1.2 inet 与 cidr 函数

函数 返回类型 描述 例子 返回结果
abbrev(inet) text 文本格式的缩写 abbrev(inet ‘10.1.0.0/16’) 10.1.0.0/16
abbrev(cidr) text 转换为文本的缩写形式 abbrev(cidr ‘10.1.0.0/16’) 10.1/16
broadcast(inet) inet broadcast address for network broadcast(‘192.168.1.5/24’) 192.168.1.255/24
family(inet) int 获得ip地址的协议版本; 4 是 IPv4, 6 是 IPv6 family(‘::1’) 6
host(inet) text extract IP address as text host(‘192.168.1.5/24’) 192.168.1.5
hostmask(inet) inet 获得ip的主机ip掩码 hostmask(‘192.168.23.20/30’) 0.0.0.3
masklen(inet) int 获得ip的子网掩码的长度 masklen(‘192.168.1.5/24’) 24
netmask(inet) inet construct netmask for network netmask(‘192.168.1.5/24’) 255.255.255.0
network(inet) cidr 获得ip地址的网络部分(network) network(‘192.168.1.5/24’) 192.168.1.0/24
set_masklen(inet, int) inet set netmask length for inet value set_masklen(‘192.168.1.5/24’, 16) 192.168.1.5/16
set_masklen(cidr, int) cidr 设置cidr类型的子网掩码长度 set_masklen(‘192.168.1.0/24’::cidr, 16) 192.168.0.0/16
text(inet) text extract IP address and netmask length as text text(inet ‘192.168.1.5’) 192.168.1.5/32

因为任何cidr的值都可以显式或隐式的转换为inet 所以上述表格对inet的操作对于cidr同样有效(但是一些函数在处理两种类型时进行的操作不同 所以分开举例)。并且inet也允许被转换为cidr, 在转换完成后 inet 所有的子网掩码右侧的位都将变为零以创建有效的cidr值。另外,你可以将text类型转换为inet或者cidr通过常规语法:inet(expression)colname::cidr

2.区别:

根据https://www.postgresql.org/message-id/CABRT9RAr2bFrxdx93H_aEQsKmuchMwurSfENP8itSpExsWsF7g%40mail.gmail.com

两者最基本的差别是 cidr 不能接接受子网掩码(netmask)右侧不为0的ip而inet可以。

如果你有一个ip的子网掩码为/8 那么cidr只能接受最右边24位都为零的ip(10.0.0.0/8) 而 inet 没有这样的限制

例:

  1. db=# select '255.0.0.0/8'::cidr;
  2. 255.0.0.0/8
  3. db=# select '255.1.0.0/8'::cidr;
  4. ERROR: invalid cidr value: "255.1.0.0/8"
  5. DETAIL: Value has bits set to right of mask.
  6. inet 则可以存放这样的值
  7. db=# select '255.1.0.0/8'::inet;
  8. 255.1.0.0/8
0 评论  
添加一条新评论