第三章. 數(shù)據(jù)類型
內(nèi)容
數(shù)值類型
貨幣類型
字符類型
日期/時(shí)間類型
布爾類型
幾何類型
IP 版本 4 網(wǎng)絡(luò)和主機(jī)類型
描述 Postgres 內(nèi)建的可用數(shù)據(jù)類型.
Postgres 有著豐富的數(shù)據(jù)類型可用.用戶可以使用 DEFINE TYPE 命令為 Postgres增加新的數(shù)據(jù)類型.
在數(shù)據(jù)類型這部分,隨后的各節(jié)將討論 SQL 標(biāo)準(zhǔn)的兼容性,移植問題和使用問題.一些 Postgres 類型直接與 SQL92-兼容類型相對(duì)應(yīng).其它一些 SQL92 語法定義的數(shù)據(jù)類型直接映射為Postgres 內(nèi)部的數(shù)據(jù)類型.許多內(nèi)建的數(shù)據(jù)類型有明確的外部格式.但是,有一些數(shù)據(jù)類型或者是Postgres特有的,如開放和閉合路徑,或者是有幾種可能格式的類型,如日期和時(shí)間類型.
表 3-1. Postgres數(shù)據(jù)類型
Postgres 類型 SQL92 或 SQL3 類型 描述
bool boolean 邏輯布爾量 (真/假)
box 二維平面中的方形盒
char(n) character(n) 定長字符串
cidr IP v4網(wǎng)絡(luò)或主機(jī)地址
circle 二維平面中的圓
date date 日歷日期(不帶時(shí)間)
decimal decimal(p,s) p <= 9,s = 0 的準(zhǔn)確數(shù)字
float4 float(p), p < 7 精度為p的浮點(diǎn)數(shù)
float8 float(p), 7 <= p < 16 雙精度浮點(diǎn)數(shù)
inet IP v4網(wǎng)絡(luò)或主機(jī)地址
int2 smallint 兩字節(jié)長帶符號(hào)整數(shù)
int4 int, integer 四字節(jié)長帶符號(hào)整數(shù)
int8 八字節(jié)長帶符號(hào)整數(shù)
interval interval 通用的時(shí)間間隔
line 二維平面中的直線(無限長)
lseg 二維平面中的線段
money decimal(9,2) 美國風(fēng)格的貨幣類型
numeric numeric(p,s) p == 9,s = 0的準(zhǔn)確數(shù)字
path 二平面的開放的或封閉的幾何路徑
point 二維平面中的點(diǎn)
polygon 二維平面中的封閉幾何路徑
serial 用于索引和/或交叉索引的獨(dú)一無二的標(biāo)識(shí)符
time time 一天里的時(shí)間
timetz time with time zone 一天里的時(shí)間,包括時(shí)區(qū)
timestamp timestamp with time zone 日期/時(shí)間
varchar(n) character varying(n) 變長的字符串
注意: cidr 和 inet 用于處理任何IP類型數(shù)據(jù),但目前只能處理ipv4的數(shù)據(jù).在以后的版本里我們將將所有對(duì)ipv4的支持增加到對(duì)ipv6的支持中.
表 3-2. Postgres 函數(shù)常量
Postgres 函數(shù) SQL92 常量 描述
getpgusername() current_user 當(dāng)前會(huì)話的用戶名
date('now') current_date 當(dāng)前事務(wù)的日期
time('now') current_time 當(dāng)前事務(wù)的時(shí)間
timestamp('now') current_timestamp 當(dāng)前事務(wù)的日期和時(shí)間
Postgres 擁有開發(fā) ORDBMS 應(yīng)用的首要特性.除了符合SQL3規(guī)范外,我們還支持很大一部分 SQL92 規(guī)范.盡管我們盡可能地遵循 SQL92 規(guī)范,但該規(guī)范里有一些方面欠缺考慮,在后繼的規(guī)范中不可能繼續(xù)存在.Postgres不會(huì)為這些特性花費(fèi)太多的時(shí)間;因?yàn)檫@些方面主要發(fā)生在很少使用或語意含混的場合,典型的用戶很少能碰到它們。
絕大多數(shù)與基本類型(如:整數(shù)和浮點(diǎn)數(shù))對(duì)應(yīng)的輸入輸出函數(shù)都會(huì)做錯(cuò)誤檢查.出于改善執(zhí)行性能的考慮,一些操作符和函數(shù)(如加法和乘法)并不做運(yùn)行時(shí)的錯(cuò)誤檢查.因而在一些系統(tǒng)上的對(duì)某些數(shù)據(jù)類型的數(shù)字操作會(huì)導(dǎo)致輕微的數(shù)值溢出或下溢。
要注意的是一些輸入輸出函數(shù)是不可逆的.也就是說,一個(gè)輸出函數(shù)的輸出結(jié)果與輸入的數(shù)據(jù)相比可能會(huì)丟失精度。
注意:浮點(diǎn)數(shù)可以保持該類型的最高固有精度(一般來說,雙精度是15位,4字節(jié)浮點(diǎn)數(shù)是6位).其他依賴浮點(diǎn)的數(shù)據(jù)類型(如,幾何類型)也有相似精度.
數(shù)值類型
數(shù)值類型由2或4字節(jié)的整數(shù)以及4或8字節(jié)的浮點(diǎn)數(shù)和固定精度小數(shù)組成。
表 3-3. Postgres 數(shù)值類型
數(shù)值類型 存儲(chǔ)空間 描述 范圍
decimal 變長 用戶聲明精度 ~8000 位(數(shù)字)
float4 4 bytes 變精度 6 位數(shù)字
float8 8 bytes 變精度 15 位數(shù)字
int2 2 bytes 固定精度 -32768 到 +32767
int4 4 bytes 常用的固定精度數(shù) -2147483648 到 +2147483647
int8 8 bytes 極大范圍的固定精度數(shù) +/- > 18 位數(shù)字
numeric variable 用戶聲明精度 無限制
serial 4 bytes 標(biāo)識(shí)或交叉索引 0 到 +2147483647
數(shù)值類型對(duì)應(yīng)有一套完整的數(shù)學(xué)操作符和函數(shù).相關(guān)信息請(qǐng)參考 數(shù)字操作符 和 數(shù)學(xué)函數(shù)。
int8 類型因?yàn)槭且烤幾g器來支持的,因而可能無法在所有平臺(tái)上得到支持。
Serial(序列)類型
serial 類型是 Postgres 用其他現(xiàn)有的類型構(gòu)造出來的一種特殊的類型.典型的應(yīng)用是創(chuàng)建表的唯一標(biāo)識(shí),在當(dāng)前的實(shí)現(xiàn)中,下面一句話:
CREATE TABLE tablename (colname SERIAL);
等價(jià)于下面幾句話:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename
(colname INT4 DEFAULT nextval('tablename_colname_seq');
CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);
注意
創(chuàng)建為serial 類型的隱含序列號(hào)在刪除表時(shí)不會(huì)自動(dòng)刪除
在刪除一個(gè)包含 serial 類型的表的時(shí)候,隱含的支持 serial 的序列號(hào)不會(huì)被自動(dòng)刪除。因此下面順序執(zhí)行的命令將是無效的:
CREATE TABLE tablename (colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename (colname SERIAL);
除非顯式地使用 DROP SEQUENCE 命令,序列號(hào)不會(huì)被刪掉而一直在數(shù)據(jù)庫里面。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
貨幣類型
過時(shí)的類型:money (貨幣)現(xiàn)在已經(jīng)過時(shí),用numeric 或 decimal 取代它。
money 類型支持US-類的固定小數(shù)點(diǎn)位置的貨幣數(shù)字.如果編譯Postgres 時(shí)使用了 USE_LOCALE 編譯選項(xiàng),貨幣類型將使用為locale(7)定義的貨幣習(xí)慣.
表 3-4. Postgres 貨幣類型
貨幣類型 存儲(chǔ)空間 描述 范圍
money 4 字節(jié) 固定精度 -21474836.48 到 +21474836.47
numeric 最終將取代貨幣類型。因而應(yīng)該優(yōu)先使用。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
字符類型
SQL92 定義了兩種基本的字符類型: char 和 varchar. Postgres 支持這些類型,并且還支持更通用的 text 類型,該類型不象varchar 一樣必須要定義一個(gè)數(shù)據(jù)域的上限.
表 3-5. Postgres 字符類型
字符類型 存儲(chǔ)空間 評(píng)價(jià) 描述
char 1 字節(jié) SQL92-兼容 單字符
char(n) (4+n) 字節(jié) SQL92-兼容 定長,不足補(bǔ)空白
text (4+x) 字節(jié) 最優(yōu) 變長
varchar(n) (4+n) 字節(jié) SQL92-兼容 變長,有局限
另外還有一種定長字符類型. name 類型,該類型只有一個(gè)用途,就是提供給Postgres 一個(gè)特別的類型用于內(nèi)部名字.該類型通常不是給一般用戶使用的.該類型長度當(dāng)前定為32字符長,但可以使用 NAMEDATALEN 重新定義.這個(gè)(變量)是在編譯的時(shí)候設(shè)置的,在以后的版本可能會(huì)改變.
表 3-6. Postgres 特殊字符類型
字符類型 存儲(chǔ)空間 描述
name 32 字節(jié) 32字節(jié)內(nèi)部類型
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
日期/時(shí)間類型
PostgreSQL 支持 SQL 中所有的日期和時(shí)間類型。
表 3-7. Postgres 日期/時(shí)間類型
類型 描述 存儲(chǔ) 最早 最晚 精度
timestamp 用于包含日期和時(shí)間的數(shù)據(jù) 8 bytes 4713 BC AD 1465001 1 microsec / 14 digits
interval 用于時(shí)間間隔 12 bytes -178000000 years 178000000 years 1 mircosecond
date 用于只包含日期的數(shù)據(jù) 4 bytes 4713 BC 32767 AD 1 day
time 用于只包含時(shí)刻的數(shù)據(jù) 4 bytes 00:00:00.00 23:59:59.99 1 microsecond
注意:為了保證和早期 PostgreSQL 版本的兼容,我們還繼續(xù)提供 datetime(等效于timestamp)和timespan(等效于interval)。不過對(duì)這些類型的支持現(xiàn)在局限于進(jìn)行一個(gè)隱含的轉(zhuǎn)換,轉(zhuǎn)換成timestamp 和 interval。類型abstime和 reltime 是低分辨率類型,它們被用于系統(tǒng)內(nèi)部。我們不鼓勵(lì)你在新的應(yīng)用里面使用這些類型,同時(shí)我們支持合適的時(shí)候把舊應(yīng)用中對(duì)應(yīng)的類型轉(zhuǎn)換成目前上面指明的。因?yàn)檫@些舊類型的部分或全部在未來的版本里可能消失。
日期/時(shí)間輸入
日期和時(shí)間的輸入幾乎可以是任何合理的格式,包括ISO-8601,SQL-兼容的,傳統(tǒng) Postgres 的和其他形式的。日期輸入里的月份和日子輸入可以是模糊的,因此存在一個(gè)設(shè)置用來表明具體應(yīng)該如何解釋。命令 SET DateStyle TO 'US' 或 SET DateStyle TO 'NonEuropean' 表示設(shè)置為“月份在日子前面”,而命令 SET DateStyle TO 'European' 表示設(shè)置為“日子在月份前面”。缺省是 ISO 風(fēng)格,但是缺省值可以在編譯或者運(yùn)行時(shí)改變。
參閱 日期/時(shí)間支持 獲取關(guān)于日期/時(shí)間輸入的準(zhǔn)確的分析規(guī)則和可識(shí)別的時(shí)區(qū)的信息。
記住任何日期或者時(shí)間輸入需要被單引號(hào)包圍,就象一個(gè)文本字符串一樣。
date(日期)
下表是 date 類型可能的輸入方式。
表 3-8. PostgreSQL 日期輸入
例子 描述
January 8, 1999 無模糊
1999-01-08 ISO-8601 格式,建議方式
1/8/1999 US;在 European 模式下讀做八月一日
8/1/1999 European;在 US 模式下讀做八月一日
1/18/1999 US;在任何模式下都讀做一月十八日
1999.008 年和年里的第幾天
19990108 ISO-8601 年,月,日
990108 ISO-8601 年,月,日
1999.008 年和年里的第幾天
99008 年和年里的第幾天
January 8, 99 BC 公元前99年
表 3-9. PostgreSQL 月份縮寫
月份 縮寫
April(四月) Apr
August(八月) Aug
December(十二月) Dec
February(二月) Feb
January(一月) Jan
July(七月) Jul
June(六月) Jun
March(三月) Mar
November(十一月) Nov
October(十月) Oct
September(九月) Sep, Sept
注意: 五月(May)沒有縮寫,原因是顯而易見的。
表 3-10. PostgreSQL 星期縮寫
星期 縮寫
Sunday(星期天) Sun
Monday(星期一) Mon
Tuesday(星期二) Tue, Tues
Wednesday(星期三) Wed, Weds
Thursday(星期四) Thu, Thur, Thurs
Friday(星期五) Fri
Saturday(星期六) Sat
time(時(shí)間)
下面是有效的 time (時(shí)間)輸入
表 3-11. PostgreSQL 時(shí)間輸入
例子 描述
04:05:06.789 ISO-8601,所有的時(shí)間域
04:05:06 ISO-8601
04:05 ISO-8601
040506 ISO-8601
04:05 AM 與04:05一樣;AM 不影響數(shù)值
04:05 PM 與 16:05一樣;輸入小時(shí)數(shù)必須 <= 12
z 與 00:00:00 一樣
zulu 與 00:00:00 一樣
allballs 與 00:00:00 一樣
帶時(shí)區(qū)時(shí)間
這個(gè)類型是 SQL92 定義的,但是該定義顯示出非常基本的不足,使得這個(gè)類型幾乎無用。在多數(shù)情況下,date,time 和 timestamp 的組合應(yīng)該能提供任何應(yīng)用所需要的日期/時(shí)間功能的全部范圍。
帶時(shí)區(qū)時(shí)間 接受所有對(duì) time 類型也合法的輸入,附加一個(gè)合法的時(shí)區(qū),如下:
表 3-12. Postgres 帶時(shí)區(qū)時(shí)間輸入
例子 描述
04:05:06.789-8 ISO-8601
04:05:06-08:00 ISO-8601
04:05-08:00 ISO-8601
040506-08 ISO-8601
參考 Postgres 時(shí)區(qū)輸入 獲取時(shí)區(qū)的更多例子。
timestamp(時(shí)標(biāo))
有效的 timestamp 類型的輸入包含一個(gè)日期和一個(gè)時(shí)間的連接,后面跟著可選的 AD 或 BC,再后面跟著可選的時(shí)區(qū)。(參閱下面。)因此
1999-01-08 04:05:06 -8:00
是一個(gè)有效的 timestamp 值,它是 ISO-兼容的。另外,已經(jīng)廣泛使用的格式
January 8 04:05:06 1999 PST
也是支持的。
表 3-13. PostgreSQL 時(shí)區(qū)輸入
時(shí)區(qū) 描述
PST 太平洋標(biāo)準(zhǔn)時(shí)間(Pacific Standard Time)
-8:00 ISO-8601 與 PST 的偏移
-800 ISO-8601 與 PST 的偏移
-8 ISO-8601 與 PST 的偏移
interval(時(shí)間間隔)
interval 可以用下面語法聲明:
Quantity Unit [Quantity Unit...] [Direction]
@ Quantity Unit [Direction]
這里:Quantity 是 ...,-1,0,1,2,...;Unit 是 second,minute,hour,day,week,month,year,decade,century,millenium,或者這些單位的縮寫或復(fù)數(shù);Direction 可以是 ago 或者為空。
特殊值
下面的SQL-兼容的函數(shù)可以用于對(duì)應(yīng)的數(shù)據(jù)類型的日期或時(shí)間輸入:CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP。
PostgreSQL 為方便期間同樣還支持幾個(gè)特殊常量。
表 3-14. PostgresSQL 日期/時(shí)間特殊常量
常量 描述
current 當(dāng)前事務(wù)時(shí)間, (使用時(shí))deferred
epoch 1970-01-01 00:00:00+00 (Unix 系統(tǒng)零時(shí))
infinity 比任何有效時(shí)間晚
-infinity 比任何有效時(shí)間早
invalid 非法輸入
now 當(dāng)前事務(wù)時(shí)間
today 今日午夜
tomorrow 明日午夜
yesterday 昨日午夜
'now' 在該值被插入時(shí)解釋,'current' 在每次檢索該值時(shí)被解釋。所以你可能會(huì)在大多數(shù)應(yīng)用里使用 'now'。(當(dāng)然你真的想用 CURRENT_TIMESTAMP 的話也行,它等效于 'now'。)
日期/時(shí)間輸出
使用 SET DateStyle,輸出格式可以設(shè)成四種風(fēng)格之一: ISO-8601, SQL (Ingres),傳統(tǒng)的 Postgres,和 German 風(fēng)格。缺省是 ISO 格式。
表 3-15. PostgreSQL 日期/時(shí)間輸出風(fēng)格
風(fēng)格描述 描述 例子
'ISO' ISO-8601 標(biāo)準(zhǔn) 1997-12-17 07:37:16-08
'SQL' 傳統(tǒng)風(fēng)格 12/17/1997 07:37:16.00 PST
'Postgres' 原始風(fēng)格 Wed Dec 17 07:37:16 1997 PST
'German' 地區(qū)風(fēng)格 17.12.1997 07:37:16.00 PST
日期和時(shí)間風(fēng)格的輸出當(dāng)然只是對(duì)應(yīng)上面例子的日期或者時(shí)間部分。
SQL 風(fēng)格有歐洲和非歐洲(US)變種, 決定月份后面是日期還是正相反.(參閱上面日期/時(shí)間輸入部分,看看這個(gè)設(shè)置是如何影響對(duì)輸入值的解釋。)
表 3-16. PostgreSQL 日期順序傳統(tǒng)
風(fēng)格 描述 例子
European 日/月/年 17/12/1997 15:37:16.00 MET
US 月/日/年 12/17/1997 07:37:16.00 PST
interval 的輸出看起來象輸入格式,只是象 week 或 century 這樣的單位被轉(zhuǎn)換成年和日。在 ISO 模式下輸出看起來象
[ Quantity Units [ ... ] ] [ Days ] Hours:Minutes [ ago ]
有幾種方法可以影響日期/時(shí)間類型的輸出:
直接在postmaster啟動(dòng)時(shí)用于后端的環(huán)境變量 PGDATESTYLE。
會(huì)話開始時(shí)用于 libpg 的環(huán)境變量 PGDATESTYLE。
SQL 命令 SET DATESTYLE。
時(shí)區(qū)
Postgres 在典型應(yīng)用中盡可能與SQL92 的定義相兼容.但 SQL92 標(biāo)準(zhǔn)在日期和時(shí)間類型和功能上有一些奇怪的混淆.兩個(gè)顯而易見的問題是:
date(日期)類型與時(shí)區(qū)沒有聯(lián)系,而 time(時(shí)間)類型卻有或可以有.
缺省的時(shí)區(qū)用一個(gè)整數(shù)常量表示與GMT/UTC的偏移(時(shí)差).
然而,現(xiàn)實(shí)世界的時(shí)區(qū)只有在與時(shí)間和日期都關(guān)聯(lián)時(shí)才有意義,因?yàn)闀r(shí)間偏移量(時(shí)差)可能因?yàn)閷?shí)行類似夏時(shí)制這樣的制度而在一年里有所變化.
為了克服這些困難, Postgres 只將日期和時(shí)間類型(同時(shí)包含日期和時(shí)間)與時(shí)區(qū)相關(guān)聯(lián),并且假設(shè)任何類型的當(dāng)?shù)貢r(shí)間只包含日期或時(shí)間.另外,時(shí)區(qū)的支持從操作系統(tǒng)的時(shí)區(qū)功能中引入,這樣就可以處理夏時(shí)制或其他可知的因素.
Postgres 從操作系統(tǒng)獲得介于1902年和2038年的日期的時(shí)區(qū)支持(近乎是典型的Unix類系統(tǒng)的日期限制).在這個(gè)范圍之外的日期都假設(shè)為用全球統(tǒng)一時(shí)間(Universal Coordinated Time,UTC)聲明和使用。
在系統(tǒng)內(nèi)部,所有日期和時(shí)間都是用全球統(tǒng)一時(shí)間(UTC)格式存儲(chǔ),也就是通常所說的格林威治時(shí)間(GMT).時(shí)間在發(fā)給客戶前端前由數(shù)據(jù)庫服務(wù)器轉(zhuǎn)換成本地時(shí)間,因而缺省的時(shí)區(qū)是服務(wù)器的時(shí)區(qū).
有幾種影響時(shí)區(qū)特性的方法:
直接在postmaster啟動(dòng)時(shí)后端使用TZ環(huán)境變量作為缺省時(shí)區(qū).
客戶端使用libpq時(shí)用 PGTZ 環(huán)境變量將時(shí)區(qū)信息傳遞給后端.
SQL 命令 SET TIME ZONE 可以給會(huì)話設(shè)置時(shí)區(qū).
如果使用了非法的時(shí)區(qū),時(shí)區(qū)變?yōu)镚MT(在大多數(shù)系統(tǒng)上)。
注意:如果設(shè)置了編譯選項(xiàng) USE_AUSTRALIAN_RULES,那么 EST 代表澳大利亞東部標(biāo)準(zhǔn)時(shí)間,( Australia Eastern Std Time)與UTC有 +10:00 小時(shí)的偏移量。
內(nèi)部
Postgres 用 Julian 記日法用于所有日期/時(shí)間計(jì)算。如果假設(shè)一年的長度是365.2425天時(shí),這個(gè)方法可以很精確地預(yù)計(jì)/計(jì)算從4713BC(公元前4713年)到很久的未來的任意一天的日期。
19世紀(jì)以前的日期傳統(tǒng)(歷法)對(duì)一些趣味讀物有意義,但是在我們這里好象沒有充分的理由把它們編碼入日期/時(shí)間控制器里面去。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
布爾類型
Postgres 支持用 bool 作為 SQL3 布爾數(shù)據(jù)類型. bool只能有兩個(gè)狀態(tài)之一: '真'('True') 或 '假'('False').第三種狀態(tài),'未知'('Unknow'),在 SQL3中沒有建議,因而也沒有實(shí)現(xiàn);NULL是一個(gè)有效的替代品.bool可用于任何布爾表達(dá)式,并且布爾表達(dá)式的結(jié)果也是布爾類型兼容的.
bool 使用1字節(jié)存儲(chǔ)空間.
表 3-17. Postgres 布爾類型
狀態(tài) 輸出 輸入
True 't' TRUE, 't', 'true', 'y', 'yes', '1'
False 'f' FALSE, 'f', 'false', 'n', 'no', '0'
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
幾何類型
幾何類型表示二維的平面物體.最基本的類型:點(diǎn),是其他類型的基礎(chǔ).
表 3-18. Postgres 幾何類型
幾何類型 存儲(chǔ)空間 表達(dá) 描述
point 16 bytes (x,y) 空間中一點(diǎn)
line 32 bytes ((x1,y1),(x2,y2)) (無窮)直線
lseg 32 bytes ((x1,y1),(x2,y2)) 線段
box 32 bytes ((x1,y1),(x2,y2)) 長方形
path 4+32n bytes ((x1,y1),...) 閉合路徑(與多邊形類似)
path 4+32n bytes [(x1,y1),...] 開放路徑
polygon 4+32n bytes ((x1,y1),...) 多邊形(與閉合路徑相似)
circle 24 bytes <(x,y),r> 圓(圓心和半徑)
一系列豐富的函數(shù)和操作符可用來進(jìn)行各種幾何計(jì)算,如度量,轉(zhuǎn)換,旋轉(zhuǎn)和計(jì)算相交等。
Point(點(diǎn))
點(diǎn)是集合類型的基本二維構(gòu)造單位。
用下面語法描述 point:
( x , y )
x , y
這里的參數(shù)是
x
是用一個(gè)浮點(diǎn)數(shù)表示的點(diǎn)的 x 坐標(biāo)。
y
y 是用一個(gè)浮點(diǎn)數(shù)表示的點(diǎn)的 y 坐標(biāo)。
線段
線段(lseg)是用一對(duì)點(diǎn)來代表的.
lseg 用下面語法聲明:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
這里的參數(shù)是
(x1,y1), (x2,y2)
是線段的端點(diǎn)。
Box(方)
方是用一對(duì)對(duì)角點(diǎn)來表示的。
box 用下面語法聲明:
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1 , x2 , y2
這里的參數(shù)是
(x1,y1), (x2,y2)
是一對(duì)對(duì)角點(diǎn)。
方的輸出使用第一種語法.在輸入時(shí)將按先左下角后右上角的順序重新排列.你也可以輸入其他的一對(duì)對(duì)角點(diǎn).但輸入時(shí)將按照先左下角后右上角的順序重排并存儲(chǔ).
Path(路徑)
路徑由一系列連接的點(diǎn)組成.路徑可能是"開放"的,也就是第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)沒有連接,也可能是"閉合"的,這時(shí)第一個(gè)和最后一個(gè)點(diǎn)連接起來.我們提供了函數(shù) popen(p) 和 pclose(p)來強(qiáng)制路徑是開放的還是閉合的,可以用函數(shù) isopen(p) 和 isclosed(p) 來在查詢中選擇是那種.
path 用下面語法聲明:
( ( x1 , y1 ) , ... , ( xn , yn ) )
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
這里的參數(shù)是
(x,y)
組成路徑的線段的端點(diǎn)。前面的("[")表明一個(gè)開放的路徑,而前面的("(")表明一個(gè)閉合的路徑。
路徑的輸出使用第一種語法輸出.注意 Postgres v6.1以前的版本路徑的格式是由一個(gè)圓括號(hào)開始――一個(gè)"關(guān)閉標(biāo)志",一個(gè)點(diǎn)的計(jì)數(shù)然后后面是點(diǎn)的列表,最后是一個(gè)圓括號(hào)結(jié)束.有一個(gè)內(nèi)建的函數(shù)upgradepath 可用于從6.1前版本輸出和重載路徑,將其轉(zhuǎn)換成新的。
Polygon(多邊形)
多邊形由一系列點(diǎn)代表.多邊形可以認(rèn)為與閉合路徑一樣,但是存儲(chǔ)方式不一樣而且有自己的一套支持過程/函數(shù).
polygon 用下列語法聲明:
( ( x1 , y1 ) , ... , ( xn , yn ) )
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1 , ... , xn , yn )
x1 , y1 , ... , xn , yn
這里的參數(shù)是
(x,y)
組成多邊形邊界的線段的端點(diǎn)。
多邊形輸出使用第一種語法.要注意在 Postgres 版本v6.1前,多邊形的格式是一個(gè)圓括號(hào)開頭,后面是點(diǎn)的x坐標(biāo)列表,然后是點(diǎn)的y坐標(biāo)列表,最后是一個(gè)圓括號(hào)結(jié)束.用內(nèi)建的函數(shù)upgradepoly 可用于從6.1前版本輸出和重載多邊形,將其轉(zhuǎn)換成新的。
Circle(圓)
圓由一個(gè)圓心和一個(gè)半徑代表.
circle 用下面語法表示:
< ( x , y ) , r >
( ( x , y ) , r )
( x , y ) , r
x , y , r
這里的參數(shù)是
(x,y)
圓心
r
圓的半徑
圓的輸出用第一個(gè)格式.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
IP 版本 4 網(wǎng)絡(luò)和主機(jī)地址
cidr 類型用于存儲(chǔ)用 CIDR(Classless Inter-Domain Routing)符號(hào)聲明的網(wǎng)絡(luò). inet 類型用一種形式簡單的變種來表示簡單的主機(jī)TCP/IP地址,并以此來存儲(chǔ)以 CIDR 符號(hào)表示的主機(jī)和網(wǎng)絡(luò)。
表 3-19. PostgresIP V4 類型
IPV4 類型 存儲(chǔ)空間 描述 范圍
cidr 變長 CIDR 網(wǎng)絡(luò) 有效的 IPV4 CIDR 字塊
inet 變長 網(wǎng)絡(luò)和主機(jī) 有效的 IPV4 CIDR 字塊
CIDR
cidr 類型聲明一個(gè) CIDR 網(wǎng)絡(luò). 說明一個(gè)無類(classless)的網(wǎng)絡(luò)的格式是 "x.x.x.x/y" 這里 "x.x.x.x" 網(wǎng)絡(luò)地址 而 "/y" 網(wǎng)絡(luò)掩碼中1的個(gè)數(shù).如果 "/y" 部分沒有指明,那么掩碼部分用舊的有類的網(wǎng)絡(luò)分類假設(shè)進(jìn)行計(jì)算,但要求輸入的數(shù)據(jù)已經(jīng)包括了確定掩碼的所需的所有8進(jìn)制位.
下面是些例子:
表 3-20. PostgresIP 類型舉例
CIDR 輸入 CIDR 顯示
192.168.1 192.168.1/24
192.168 192.168.0/24
128.1 128.1/16
128 128.0/16
128.1.2 128.1.2/24
10.1.2 10.1.2/24
10.1 10.1/16
10 10/8
inet
inet 類型設(shè)計(jì)用來在一個(gè)數(shù)據(jù)域里存放所有主機(jī)信息,包括其所在的CIDR風(fēng)格的子網(wǎng).要注意如果你想正確存放CIDR網(wǎng)絡(luò),你應(yīng)該使用cidr 類型.inet 類型類似cidr 類型,只是它的主機(jī)部分可以是非零.可以用函數(shù)從數(shù)據(jù)域中將各種元素提取出來.
該函數(shù)的輸入格式是 x.x.x.x/y 這里 x.x.x.x 是互聯(lián)網(wǎng)主機(jī), y 是網(wǎng)絡(luò)掩碼的位數(shù).如果 /y 部分未填,當(dāng)作/32.輸出時(shí),如果 /y 部分為 /32,將不會(huì)打印出來.只要不填"/y"部分,該類型可以直接作為主機(jī)類型使用.(??This allows the type to be used as a straight host type by just leaving of the bits part. )
--------------------------------------------------------------------------------