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/

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...