postgresql----网络地址类型和函数

本人对网络这块实在是搞不清楚,要是能有人推荐一下资料就好了!不知道有没有跟我一样呢?!所以在这里先贴一点从其他地方搞来的一些IPv4的东东。

IPv4主要包括一下5类地址

A类:

07位 网络号24位 主机号

B类:

1014位 网络号16位 主机号

C类:

11021位 网络号8位 主机号

D类:

111028位 多播组号

E类:

1111027位 留待后用

 

由上表可以看出一个IPv4地址使用32位二进制表示,使用时写成4个十进制数,每个十进制占用8位,每个十进制间用句点分隔。从上表还可以看出各类IP中前面不同的位数都是固定的,所以各类IP的范围如下:

类型范围
A0.0.0.0--127.255.255.255
B128.0.0.0--191.255.255.255
C192.0.0.0--233.255.255.255
D224.0.0.0--239.255.255.255
E240.0.0.0--247.255.255.255

IPv6地址长128位,分为8组,每组使用4个十六进制数表示。

几个特殊地址:

127.0.0.1 IPv4环回地址

::1 IPv6环回地址

0.0.0.0/0 表示所有网络段

 

什么是网络地址?主机地址?子网掩码?

0.0.0.0/8 前8位为网络号,后24位为主机号,子网掩码为255.0.0.0,整个表示的主机地址范围是0.0.0.0到0.255.255.255。

主机地址应该就是网络中一个具体主机的IP地址。

子网掩码应该就是网络号全为1,主机号全为0,所以转换为十进制后0.0.0.0/8的子网掩码就是255.0.0.0。

那网络地址到底是个什么鬼呢?参考下面链接的博文解释

网络地址:把IP地址转成二进制和子网掩码进行与运算(逻辑与:0&0=0;0&1=0;1&0=0;1&1=1 )

仍使用下面博文中的例子,演示如何计算网络地址

主机地址:202.112.14.137,子网掩码:255.255.255.224

把主机地址和子网掩码分别使用二进制表示

主机:select 202::bit(8)||112::bit(8)||14::bit(8)||137::bit(8);

11001010011100000000111010001001

 

掩码:select 255::bit(8)||255::bit(8)||255::bit(8)||224::bit(8);

11111111111111111111111111100000

 

按位与计算:select B'11001010011100000000111010001001' & B'11111111111111111111111111100000';

结果:11001010011100000000111010000000

使用十进制表示:202.112.14.128

select B'11001010'::int||'.'||B'01110000'::int||'.'||B'00001110'::int||'.'||B'10000000'::int;

 

参考:http://blog.csdn.net/leichelle/article/details/8217022

 

以上还是请大家去查找一下官方正规的资料,千万不要被我误导了,因为我真的对网络这块不清楚。

 

虽然使用CHAR类型也能存储网络地址,但是CHAR本身是不会校验存储的网络地址是否合法的,且听说postgresql提供的网络地址类型对网络地址数据处理性能更高。

 

回到正文:

postgresql提供的网络地址类型有inet,cidr,macaddr三种类型用于存储网络地址和MAC地址数据。

名字存储空间描述
inet7或19字节IPv4或IPv6主机和网络地址
cidr7或19字节IPv4或IPv6网络地址
macaddr6字节MAC地址

inet

inet保存主机的IPv4或IPv6地址,以及一个可选的等效子网。该类型的输入格式是address/y,这里的address是IPv4或者IPv6地址y是子网掩码的二进制位数。如果/y部分未填,则子网掩码对IPv4而言是32对IPv6而言是128,所以该值表示只有一台主机。显示时,如果该值表示只有一台主机,/y将不会显示。

示例:

test=# select inet'192.168.31/24';
      inet       
-----------------
 192.168.31.0/24
(1 row)

test=# select inet'192.168.31.1/32';
     inet     
--------------
 192.168.31.1
(1 row)

test=# select inet'192.168.31.1';
     inet     
--------------
 192.168.31.1
(1 row)

test=# select inet'192.168.31/24';
inet
-----------------
192.168.31.0/24
(1 row)

 

cidr

基本和inet相同,inet和cidr类型之间的基本区别是inet接受子网掩码,而cidr不接受。

示例:

test=# select cidr'192.168.31/24';
      cidr       
-----------------
 192.168.31.0/24
(1 row)

test=# select cidr'192.168.31.1/32';
      cidr       
-----------------
 192.168.31.1/32
(1 row)

test=# select cidr'192.168.31.1';
      cidr       
-----------------
 192.168.31.1/32
(1 row)

test=# select cidr'192.168.31/24';
      cidr       
-----------------
 192.168.31.0/24
(1 row)

 

和inet的区别

test=# select inet'192.168.31.1/24';
      inet       
-----------------
 192.168.31.1/24
(1 row)

test=# select cidr'192.168.31.1/24';
ERROR:  invalid cidr value: "192.168.31.1/24"
LINE 1: select cidr'192.168.31.1/24';
                   ^
DETAIL:  Value has bits set to right of mask.

 

macaddr

示例:

test=# select macaddr'08:00:2b:01:02:03';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

test=# select macaddr'08-00-2b-01-02-03';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

test=# select macaddr'08002b:010203';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

test=# select macaddr'08002b-010203';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

test=# select macaddr'0800.2b01.0203';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

test=# select macaddr'08002b010203';
      macaddr      
-------------------
 08:00:2b:01:02:03
(1 row)

 

cidr和inet操作符

操作符描述示例结果
<小于select inet '192.168.1.5' < inet '192.168.1.6';t
<=小于或等于select inet '192.168.1.5' <= inet '192.168.1.5';t
=等于select inet '192.168.1.5' = inet '192.168.1.5';t
>=大于或等于select inet '192.168.1.5' >= inet '192.168.1.5';t
>大于select inet '192.168.1.5' > inet '192.168.1.4';t
<>不等于select inet '192.168.1.5' <> inet '192.168.1.4';t
<<包含于select inet '192.168.1.5' << inet '192.168.1/24';t
<<=包含于或等于select inet '192.168.1/24' <<= inet '192.168.1/24';t
>>包含select inet '192.168.1/24' >> inet '192.168.1.5';t
>>=包含或等于select inet '192.168.1/24' >>= inet '192.168.1/24';t
&&包含或包含于select inet '192.168.1/24' && inet '192.168.1.80/28't
~位非select ~ inet '192.168.1.6';63.87.254.249
&位与select inet '192.168.1.6' & inet '0.0.0.255';0.0.0.6
|位或select inet '192.168.1.6' | inet '0.0.0.255';192.168.1.255
+select inet '192.168.1.6' + 25;192.168.1.31
-select inet '192.168.1.43' - 36;192.168.1.7
-select 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为IPv6select 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(inetint)inet为inet设置子网掩码长度select set_masklen('192.168.1.5/24', 16);192.168.1.5/16
set_masklen(cidrint)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(inetinet)boolean是否属于相同的地址族select inet_same_family('192.168.1.5/24', '::1');f
inet_merge(inetinet)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 类型还支持标准关系操作符( > , <= 等)用于词法排序,和按位运算符( ~ , & 和 | )非,与和或。

 

原文链接:https://www.postgresql.org/docs/9.6/static/functions-net.html

 

转载于:https://www.cnblogs.com/alianbog/p/5657910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值