微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL数据类型:网络地址类型

感谢原作者整理分享。在此mark一下。

官方文档:http://www.postgresql.org/docs/9.4/interactive/datatype-net-types.html

一、cidr

postgres=#createtabletest(idint,nametext);
CREATETABLE
postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|

postgres=#altertabletestaddcolumnipcidr;
ALTERTABLE
postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|
ip|cidr|
postgres=#insertintotestvalues(1,'a','192.168.1.100');
INSERT01
postgres=#select*fromtest;
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
(1row)
postgres=#insertintotestvalues(2,'b','192.168.0.0/16');
INSERT01
postgres=#select*fromtest;
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.0.0/16
(2rows)
postgres=#insertintotestvalues(3,'c','192.168.1.0/24');
INSERT01
postgres=#select*fromtest;
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.0.0/16
3|c|192.168.1.0/24
(3rows)

查询使用

postgres=#select*fromtestwhereip='192.168.1.100';
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
(1row)
postgres=#select*fromtestwhereip>='192.168.1.0/24';
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
3|c|192.168.1.0/24
(2rows)

postgres=#select*fromtestwhereip>='192.168.0.0/16';
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.0.0/16
3|c|192.168.1.0/24
(3rows)
postgres=#updatetestsetip='192.168.1.101/32'whereid=2;
UPDATE1
postgres=#updatetestsetip='192.168.1.102/32'whereid=3;
UPDATE1
postgres=#select*fromtest;
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.1.101/32
3|c|192.168.1.102/32
(3rows)
postgres=#select*fromtestwhereipbetween'192.168.1.100'and'192.168.1.101';
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.1.101/32
(2rows)

postgres=#select*fromtestwhereipbetween'192.168.1.100'and'192.168.1.102';
id|name|ip
----+------+------------------
1|a|192.168.1.100/32
2|b|192.168.1.101/32
3|c|192.168.1.102/32
(3rows)

二、inet

将cidr修改为inet

postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|
ip|cidr|
postgres=#altertabletestaltercolumniptypeinet;
ALTERTABLE
postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|
ip|inet|
postgres=#select*fromtest;
id|name|ip
----+------+---------------
1|a|192.168.1.100
2|b|192.168.1.101
3|c|192.168.1.102
(3rows)

postgres=#updatetestsetip='192.168.0.0/16'whereid=3;
UPDATE1
postgres=#select*fromtest;
id|name|ip
----+------+----------------
1|a|192.168.1.100
2|b|192.168.1.101
3|c|192.168.0.0/16
(3rows)

postgres=#updatetestsetip='192.168.1.0/24'whereid=2;
UPDATE1
postgres=#select*fromtest;
id|name|ip
----+------+----------------
1|a|192.168.1.100
3|c|192.168.0.0/16
2|b|192.168.1.0/24
(3rows)

可见,inet认32位掩码的ip是不带'/32'的

postgres=#select*fromtestwhereip>='192.168.1.100';
id|name|ip
----+------+---------------
1|a|192.168.1.100
(1row)

postgres=#select*fromtestwhereip>='192.168.1.1';
id|name|ip
----+------+---------------
1|a|192.168.1.100
(1row)

postgres=#select*fromtestwhereip>='192.168.1.101';
id|name|ip
----+------+----
(0rows)
postgres=#select*fromtestwhereip>='192.168.1.0/32';
id|name|ip
----+------+---------------
1|a|192.168.1.100
(1row)
postgres=#select*fromtestwhereip>='192.168.1.0/16';
id|name|ip
----+------+----------------
1|a|192.168.1.100
2|b|192.168.1.0/24
(2rows)

postgres=#select*fromtestwhereip>='192.168.0.0/16';
id|name|ip
----+------+----------------
1|a|192.168.1.100
3|c|192.168.0.0/16
2|b|192.168.1.0/24
(3rows)

使用跟cidr差不多

三、macaddr

postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|
ip|inet|

postgres=#altertabletestaddcolumnmacmacaddr;
ALTERTABLE
postgres=#\dtest
Table"public.test"
Column|Type|Modifiers
--------+---------+-----------
id|integer|
name|text|
ip|inet|
mac|macaddr|

postgres=#select*fromtest;
id|name|ip|mac
----+------+----------------+-----
1|a|192.168.1.100|
3|c|192.168.0.0/16|
2|b|192.168.1.0/24|
(3rows)
postgres=#updatetestsetmac='08:00:2b:01:02:03'whereid=1;
UPDATE1
postgres=#select*fromtest;
id|name|ip|mac
----+------+----------------+-------------------
3|c|192.168.0.0/16|
2|b|192.168.1.0/24|
1|a|192.168.1.100|08:00:2b:01:02:03
(3rows)
postgres=#updatetestsetmac='08:00:2b:01:02:04'whereid=2;
UPDATE1
postgres=#updatetestsetmac='08:00:2b:01:02:05'whereid=3;
UPDATE1
postgres=#select*fromtest;
id|name|ip|mac
----+------+----------------+-------------------
1|a|192.168.1.100|08:00:2b:01:02:03
2|b|192.168.1.0/24|08:00:2b:01:02:04
3|c|192.168.0.0/16|08:00:2b:01:02:05
(3rows)
查询使用
postgres=#select*fromtestwheremac='08:00:2b:01:02:03';
id|name|ip|mac
----+------+---------------+-------------------
1|a|192.168.1.100|08:00:2b:01:02:03
(1row)

postgres=#select*fromtestwheremac>'08:00:2b:01:02:03';
id|name|ip|mac
----+------+----------------+-------------------
2|b|192.168.1.0/24|08:00:2b:01:02:04
3|c|192.168.0.0/16|08:00:2b:01:02:05
(2rows)

Postgresql认还不支持iprange,需要安装ip4r的扩展,详见:http://pgfoundry.org/projects/ip4r/

原文地址:https://www.jb51.cc/postgresql/195016.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐