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)類型、複合數據類型、組合類型、對象標識符等本文再也不加以介紹。