PostgreSQL之网络地址类型

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

一、cidr

postgres=# create table test (id int, name text);
CREATE TABLE
postgres=# \d test 
     Table "public.test"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 name   | text    | 

postgres=# alter table test add column ip cidr;
ALTER TABLE
postgres=# \d test 
     Table "public.test"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 name   | text    | 
 ip     | cidr    | 

postgres=# insert into test values (1, ‘a‘, ‘192.168.1.100‘);
INSERT 0 1
postgres=# select * from test ;
 id | name |        ip        
----+------+------------------
  1 | a    | 192.168.1.100/32
(1 row)
postgres=# insert into test values (2, ‘b‘, ‘192.168.0.0/16‘);
INSERT 0 1
postgres=# select * from test ;
 id | name |        ip        
----+------+------------------
  1 | a    | 192.168.1.100/32
  2 | b    | 192.168.0.0/16
(2 rows)
postgres=# insert into test values (3, ‘c‘, ‘192.168.1.0/24‘);
INSERT 0 1
postgres=# select * from test ;
 id | name |        ip        
----+------+------------------
  1 | a    | 192.168.1.100/32
  2 | b    | 192.168.0.0/16
  3 | c    | 192.168.1.0/24
(3 rows)

查询使用

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

postgres=#  select * from test where ip >= ‘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
(3 rows)
postgres=# update test set ip = ‘192.168.1.101/32‘ where id = 2;
UPDATE 1
postgres=# update test set ip = ‘192.168.1.102/32‘ where id = 3; 
UPDATE 1
postgres=# select * from test ;
 id | name |        ip        
----+------+------------------
  1 | a    | 192.168.1.100/32
  2 | b    | 192.168.1.101/32
  3 | c    | 192.168.1.102/32
(3 rows)
postgres=# select * from test where  ip between ‘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
(2 rows)

postgres=# select * from test where  ip between ‘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
(3 rows)

二、inet

将cidr修改为inet

postgres=# \d test 
     Table "public.test"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 name   | text    | 
 ip     | cidr    |
 postgres=# alter table test alter column ip type inet;
ALTER TABLE
postgres=# \d test 
     Table "public.test"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 name   | text    | 
 ip     | inet    |
postgres=# select * from test ;
 id | name |      ip       
----+------+---------------
  1 | a    | 192.168.1.100
  2 | b    | 192.168.1.101
  3 | c    | 192.168.1.102
(3 rows)

postgres=# update test set ip = ‘192.168.0.0/16‘ where id = 3;
UPDATE 1
postgres=# select * from test ;                               
 id | name |       ip       
----+------+----------------
  1 | a    | 192.168.1.100
  2 | b    | 192.168.1.101
  3 | c    | 192.168.0.0/16
(3 rows)

postgres=# update test set ip = ‘192.168.1.0/24‘ where id = 2;   
UPDATE 1
postgres=# select * from test ;
 id | name |       ip       
----+------+----------------
  1 | a    | 192.168.1.100
  3 | c    | 192.168.0.0/16
  2 | b    | 192.168.1.0/24
(3 rows)

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

postgres=# select * from test where ip >= ‘192.168.1.100‘;
 id | name |      ip       
----+------+---------------
  1 | a    | 192.168.1.100
(1 row)

postgres=# select * from test where ip >= ‘192.168.1.1‘;  
 id | name |      ip       
----+------+---------------
  1 | a    | 192.168.1.100
(1 row)

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

postgres=# select * from test where ip >= ‘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
(3 rows)

使用跟cidr差不多

三、macaddr

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

postgres=# alter table test add column mac macaddr;
ALTER TABLE
postgres=# \d test
     Table "public.test"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 
 name   | text    | 
 ip     | inet    | 
 mac    | macaddr | 

postgres=# select * from test ;
 id | name |       ip       | mac 
----+------+----------------+-----
  1 | a    | 192.168.1.100  | 
  3 | c    | 192.168.0.0/16 | 
  2 | b    | 192.168.1.0/24 | 
(3 rows)
postgres=# update test set mac = ‘08:00:2b:01:02:03‘ where id = 1;
UPDATE 1
postgres=# select * from test ;
 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
(3 rows)
postgres=# update test set mac = ‘08:00:2b:01:02:04‘ where id = 2; 
UPDATE 1
postgres=# update test set mac = ‘08:00:2b:01:02:05‘ where id = 3; 
UPDATE 1
postgres=# select * from test ;
 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
(3 rows)

查询使用

postgres=# select * from test where mac = ‘08:00:2b:01:02:03‘;
 id | name |      ip       |        mac        
----+------+---------------+-------------------
  1 | a    | 192.168.1.100 | 08:00:2b:01:02:03
(1 row)

postgres=# select * from test where mac > ‘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
(2 rows)

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

时间: 2024-11-25 10:37:11

PostgreSQL之网络地址类型的相关文章

Postgres 9.11 网络地址类型函数和操作符

9.11. 网络地址类型函数和操作符 Table 9-31 显示了可以用于 cidr 和 inet 的操作符. 操作符 <<,<<= >>,和 >>= 用于计算子网包含:它们只考虑两个地址的网络部分,忽略任何主机部分, 然后判断其中一个网络部分是等于另外一个还是另外一个的子网. Table 9-31. cidr 和 inet 操作符 操作符 描述 例子 < 小于吗 inet '192.168.1.5' < inet '192.168.1.6' &

EF框架操作postgresql,实现WKT类型坐标的插入,查询,以及判断是否相交

1.组件配置 首先,要下载.NET for Postgresql的驱动,npgsql,EF6,以及EntityFramework6.Npgsql,版本号 3.1.1.0. 由于是mvc项目,所以,把相应的配置文件写在web.config里面,如下: 1 <configSections> 2 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?L

postgresql 和.NET类型对照表

PostgreSQL type 默认的 .NET 类型 特定提供的类型 其他 .NET 类型 bool bool     int2 short   byte, sbyte, int, long, float, double, decimal, string int4 int   byte, short, long, float, double, decimal, string int8 long   long, byte, short, int, float, double, decimal,

正确使用PostgreSQL的数组类型

2014-03-03 10:10 佚名 开源中国编译 我要评论(0) 字号:T | T 在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成事件的PostgreSQL数组,并将这些事件按时间排序. AD:2014WOT全球软件技术峰会北京站 课程视频发布 在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成

PostgreSQL 修改字段类型从int到bigint

由于现在pg的版本,修改int到bigint仍然需要rewrite表,会导致表阻塞,无法使用.但可以考虑其他方式来做.此问题是排查现网pg使用序列的情况时遇到的. 由于int的最大值只有21亿左右,而且自增列多为主键,当达到最大值时,数据就会无法插入.一般情况是修改类型为bigint,但直接做会锁表,影响现网使用. 这里分两块来看: 1.分区表(修改序列):对于分区表可以直接修改序列为循环形式,而且最大值设置为int的最大值,因为单个分区表很少会将int值用完. alter sequence s

postgresql数据库-number类型模糊查询

这两种方式都是可以的: select * from aaa a where  a.org_code ||'' like '86%';--推荐使用这种,简单,一看就是高手写出来的 select * from aaa  where  1=1 and cast(org_code as varchar(10)) like '%1%'; 原文地址:https://www.cnblogs.com/dongyaotou/p/12677071.html

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

本人对网络这块实在是搞不清楚,要是能有人推荐一下资料就好了!不知道有没有跟我一样呢?!所以在这里先贴一点从其他地方搞来的一些IPv4的东东. IPv4主要包括一下5类地址 A类: 0 7位 网络号 24位 主机号 B类: 1 0 14位 网络号 16位 主机号 C类: 1 1 0 21位 网络号 8位 主机号 D类: 1 1 1 0 28位 多播组号 E类: 1 1 1 1 0 27位 留待后用 由上表可以看出一个IPv4地址使用32位二进制表示,使用时写成4个十进制数,每个十进制占用8位,每个

PostgreSQL数据类型

http://blog.csdn.net/neo_liu0000/article/category/797059 第六章  数据类型 6.1概述 PostgreSQL 提供了丰富的数据类型.用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型.PostgreSQL 的数据类型被分为四种,分别是基本数据类型.复合数据类型.域和伪类型. 基本数据类型是数据库内置的数据类型,包括integer.char.varchar等数据类型.表6-1列出了PostgreSQL提供的所有基本数据类型

MYSQL数据库迁移到POSTGRESQL数据库(人工迁移)

产品即将上线,可项目经理说要换数据库,要把mysql数据库的内容全部搬到Postgresql中去. 有一个python的工具可以实现迁移(但是存储过程无法迁移.数据类型也无法灵活对应,还要改程序),为了节约时间采用人工迁移的方式,闲话少说,以下是迁移过程,没图,对不起. 利用Navicat for Mysql工具(其它工具也可以,比如mysqldump)将数据库模式导出(只导表结构不含数据)方法略,生成的文件名为mysql.sql 利用linux sed工具把导出的脚本中的所有COMMENT及m