PostgreSQL數據類型-枚舉類型、幾何類型、網絡地址類型和其餘數據類型

PostgreSQL還有不少數據類型,例如枚舉類型、幾何類型、網絡地址和MAC地址類型、XML類型、JSON類型、數組類型、範圍(range)類型、複合數據類型、組合類型、對象標識符等。複合數據類型等價於其餘數據庫自定義數據類型。數據庫

首先介紹枚舉類型。數組

---建立weekday枚舉
postgres=# create type weekday as enum('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
CREATE TYPE
---查看枚舉weekday信息
postgres=# \dT+
                                 數據類型列表
 架構模式 |  名稱   | 內部名稱 | 大小 |   成員    |  擁有者  | 存取權限 | 描述
----------+---------+----------+------+-----------+----------+----------+------
 public   | weekday | weekday  | 4    | Monday   +| postgres |          |
          |         |          |      | Tuesday  +|          |          |
          |         |          |      | Wednesday+|          |          |
          |         |          |      | Thursday +|          |          |
          |         |          |      | Friday   +|          |          |
          |         |          |      | Saturday +|          |          |
          |         |          |      | Sunday    |          |          |
(1 行記錄)
---另外一種查詢枚舉方法
postgres=# select * from pg_enum;
 enumtypid | enumsortorder | enumlabel
-----------+---------------+-----------
     16486 |             1 | Monday
     16486 |             2 | Tuesday
     16486 |             3 | Wednesday
     16486 |             4 | Thursday
     16486 |             5 | Friday
     16486 |             6 | Saturday
     16486 |             7 | Sunday
(7 行記錄)

postgres=#

---演示插入數據
postgres=# create table testweekday(id int,week weekday);
CREATE TABLE
postgres=# insert into testweekday values(1,'Sunday'),(2,'Monday');
INSERT 0 2
postgres=#

PostgreSQL枚舉類型相似於C#枚舉數據類型,用戶輸入數據必須符合已有數據,沒法輸入其餘值。枚舉類型輸入值區分大小寫,錯誤輸入會致使錯誤發生。網絡

枚舉類型字段能夠在表列內比較大小,例如架構

postgres=# insert into testweekday values(3,'Tuesday'),(4,'Thursday');
INSERT 0 2
postgres=# select week from testweekday;
   week
----------
 Sunday
 Monday
 Tuesday
 Thursday
(4 行記錄)

postgres=# select min(week),count(week) from testweekday;
  min   | count
--------+-------
 Monday |     4
(1 行記錄)

postgres=#

PostgreSQL支持二維幾何數據類型,採用笛卡爾座標系。如點、直線、線段、矩形和圓等。虛數、極座標、張量等都是複合數據類型。post

postgres=# create table testgeometry(testpoint point,testline line,testbox box);
CREATE TABLE
postgres=# insert into testgeometry(testpoint,testline,testbox) values('(1,0)',null,null),(null,'((1,2),(2,2))',null),(null,null,'((0,0),(1,1))');
INSERT 0 3
postgres=#

[]表示開放路徑,()表示閉合路徑。閉合路徑成環。測試

PostgreSQL網絡地址數據類型cidr和inet支持IPv4和和IPv6數據類型,MAC地址數據類型macaddr支持MAC地址。code

postgres=# create table networkaddress(testcidr cidr,testinet inet);
CREATE TABLE
postgres=#
postgres=# insert into networkaddress values('192.168.0.0/24','192.168.0.0/24');
INSERT 0 1
postgres=# insert into networkaddress values('192.168.0.0/16','192.168.0.0/16');
INSERT 0 1
postgres=# insert into networkaddress values('192.168.0.0/16','192.168.0.0/8');
INSERT 0 1
postgres=# insert into networkaddress values('192.168.0.1','192.168.0.1');
INSERT 0 1
postgres=# select testcidr,testinet from networkaddress;
    testcidr    |    testinet
----------------+----------------
 192.168.0.0/24 | 192.168.0.0/24
 192.168.0.0/16 | 192.168.0.0/16
 192.168.0.0/16 | 192.168.0.0/8
 192.168.0.1/32 | 192.168.0.1
(4 行記錄)

postgres=#

根據測試數據輸入結果可知,cidr和inet子網掩碼都可省略,須要注意IPv4子網掩碼書寫方式爲純數字,範圍爲0-32。IPv6子網掩碼範圍爲0-128。二者區別在於cidr會檢查輸入值正確性,輸出時帶子網掩碼。對象

postgres=# insert into networkaddress values('192.168.0/16','192.168.0/16');
INSERT 0 1
---第二個值子網掩碼錯誤
postgres=# insert into networkaddress values('192.168.0/16','192.168.0/1');
INSERT 0 1
postgres=# select testcidr,testinet from networkaddress;
    testcidr    |    testinet
----------------+----------------
 192.168.0.0/24 | 192.168.0.0/24
 192.168.0.0/16 | 192.168.0.0/16
 192.168.0.0/16 | 192.168.0.0/8
 192.168.0.1/32 | 192.168.0.1
 192.168.0.0/16 | 192.168.0.1
 192.168.0.0/16 | 192.168.0.0/16
 192.168.0.0/16 | 192.168.0.0/1
(6 行記錄)

postgres=#
---錯誤寫法
---postgres=# insert into networkaddress values('192.168.0/16','192.168.0');

輸入數據能夠不寫徹底。注意對比錯誤寫法和正確寫法區別,對比查詢結果。ci

macaddr儲存子網掩碼地址,子網掩碼是16進制字符,長度爲8位,能夠接受分段和分隔符,分隔符能夠是:或-,能夠省略不寫。例如00-00-00-00-00-C0每兩個字符分段一次,以-做爲分隔符,分割長度能夠爲二、四、六、和8。-和:分隔符長度能夠是2和6。.做爲分隔符只支持相似0000.0000.00C0格式。架構模式

postgres=# create table testmacaddress(testmacaddr macaddr);
CREATE TABLE
postgres=# insert into testmacaddress values('00-00-00-00-00-C0'),('00-00-00-00-00-c1');
INSERT 0 2
postgres=# insert into testmacaddress values('0000-0000-00C0'),('00-00-00-00-00-c1');
INSERT 0 2
postgres=# insert into testmacaddress values('000000-0000C0'),('00-00-00-00-00-c1');
INSERT 0 2
postgres=# insert into testmacaddress values('0000.0000.00C0'),('00-00-00-00-00-c1');
INSERT 0 2
postgres=# insert into testmacaddress values('0000.0000.00C0'),('00-00-00-00-00-c1');
INSERT 0 2
postgres=# select * from testmacaddress;
    testmacaddr
-------------------
 00:00:00:00:00:c0
 00:00:00:00:00:c1
 00:00:00:00:00:c0
 00:00:00:00:00:c1
 00:00:00:00:00:c0
 00:00:00:00:00:c1
 00:00:00:00:00:c0
 00:00:00:00:00:c1
 00:00:00:00:00:c0
 00:00:00:00:00:c1
(10 行記錄)

postgres=#

推薦:2位長度分隔或無符號分隔。

XML類型、JSON類型、數組類型、範圍(range)類型、複合數據類型、組合類型、對象標識符等本文再也不加以介紹。

相關文章
相關標籤/搜索