PostgreSQL 數據類型

PostgreSQL 有着豐富的數據類型可用。 用戶可使用 CREATE TYPE 命令爲 PostgreSQL 增長新的數據類型。數據庫

Table 8-1 顯示了全部內置的普通數據類型。 在"別名"列裏列出的大多數可選名字都是因歷史緣由 PostgreSQL 在內部使用的名字。 另外,還有一些內部使用的或者廢棄的類型也能夠用,但沒有在這裏列出。數組

Table 8-1. 數據類型網絡

名字 別名 描述
bigint int8 有符號 8 字節整數
bigserial serial8 自增八字節整數
bit [ (n) ]   定長位串
bit varying [ (n) ] varbit 變長位串
boolean bool 邏輯布爾量 (真/假)
box   平面中的長方形
bytea   二進制數據("字節數組")
character varying [ (n) ] varchar [ (n) ] 變長字符串
character [ (n) ] char [ (n) ] 定長字符串
cidr   IPv4 或者 IPv6 網絡地址
circle   平面中的圓
date   日曆日期(年,月,日)
double precision float8 雙精度浮點數字
inet   IPv4 或者 IPv6 網絡地址
integer intint4 四字節長有符號整數
interval [ (p) ]   時間間隔
line   平面中的無限長直線
lseg   平面中的線段
macaddr   MAC 地址
money   貨幣金額
numeric [ (ps) ] decimal [ (ps) ] 可選精度的準確數字
path   平面中的幾何路徑
point   平面中的點
polygon   平面中的封閉幾何路徑
real float4 單精度浮點數
smallint int2 有符號兩字節整數
serial serial4 自增四字節整數
text   變長字符串
time [ (p) ] [ without time zone ]   一天裏的時間
time [ (p) ] with time zone timetz 一天裏的時間,包括時區
timestamp [ (p) ] [ without time zone ]   日期和時間
timestamp [ (p) ] with time zone timestamptz 日期和時間

兼容性: 下列類型(或者那樣拼寫的)是SQL聲明的: bitbit varyingboolean, charcharactercharacter varyingvarchardate, double precisioninteger, intervalnumericdecimal, realsmallinttime (包括有時區和無時區的), timestamp (包括有時區和無時區的)。函數

每種數據類型都有一個由其輸入和輸出函數決定的外部表現形式。 許多內建的類型有明顯的格式。不過,許多類型要麼是 PostgreSQL 所特有的,好比幾何路徑,要麼多是有幾種不一樣的格式,好比日期和時間類型。 有些輸入和輸出函數是不可逆的。也就是說,輸出函數的輸出結果和原始的輸入比較的時候可能丟失精度。性能

8.1. 數值類型

數值類型由二、4或8字節的整數以及4或8字節的浮點數和可選精度小數組成。 Table 8-2 列出了全部可用類型。spa

Table 8-2. 數值類型操作系統

名字 存儲空間 描述 範圍
smallint 2 字節 小範圍整數 -32768 到 +32767
integer 4 字節 經常使用的整數 -2147483648 到 +2147483647
bigint 8 字節 大範圍的整數 -9223372036854775808 到 9223372036854775807
decimal 變長 用戶聲明精度,精確 無限制
numeric 變長 用戶聲明精度,精確 無限制
real 4 字節 變精度,不精確 6 位十進制數字精度
double precision 8 字節 變精度,不精確 15 位十進制數字精度
serial 4 字節 自增整數 1 到 +2147483647
bigserial 8 字節 大範圍的自增整數 1 到 9223372036854775807

數值類型常量的語法在 Section 4.1.2 裏描述。 數值類型對應有一套完整的數學操做符和函數。相關信息請參考 Chapter 9。 下面的幾節詳細描述這些類型。對象

8.1.1. 整數類型

類型 smallintinteger,和 bigint 存儲各類範圍的所有是數字的數,也就是沒有小數部分的數字。 試圖存儲超出範圍之外的數值將致使一個錯誤。ci

經常使用的類型是 integer,由於它提供了在範圍,存儲空間, 和性能之間的最佳平衡。通常只有在磁盤空間緊張的時候才使用 smallint。而只有在 integer 的範圍不夠的時候才使用 bigint,由於前者絕對快得多。字符串

bigint 類型可能不是在全部平臺上都運轉正確, 由於它依賴編譯器對八字節整數的支持。在那些沒有這樣支持的機器上, bigint 的做用和 integer 同樣(可是仍然佔據八字節存儲)。不過,咱們還不知道任何有這樣的狀況的平臺。

SQL只聲明瞭整數類型 integer(或int)和 smallint。類型 bigint,和類型名 int2int4,和 int8 都是擴展, 也在許多其它 SQL 數據庫系統中使用。

8.1.2. 任意精度數值

類型 numeric 能夠存儲最多1000位精度的數字而且準確地進行計算。 咱們特別建議將它用於貨幣金額和其它要求計算準確的數量。不過,numeric 類型上的算術運算比整數類型或者咱們下一節描述的浮點數類型要慢不少。

在隨後的內容裏,咱們使用了下述術語: 一個 numeric 的比例是到小數點右邊爲止小數部分的位數, numeric 的精度是整個數字裏所有數據位的數目,也就是小數點兩邊的數據數目。 所以數字 23.5141 的精度爲6而比例爲4。你能夠認爲整數的比例爲零。

numeric 字段的最大精度和最大比例都是能夠配置的。要聲明一個類型爲 numeric 的字段,你能夠用下面的語法

NUMERIC(precision, scale)

精度必須爲正數,比例能夠爲零或者正數。 另外,

NUMERIC(precision)

選擇了 0 爲比例。不帶任何精度或者比例聲明

NUMERIC

則建立一個能夠存儲一個直到實現精度上限的任意精度和比例的數值, 一個這樣類型的字段將不會把輸入數值轉化成任何特定的比例, 而帶有比例聲明的 numeric 字段將把輸入值轉化爲該比例。 (SQL標準要求缺省的比例是 0。也就是轉化成整數精度。 咱們以爲這樣作有點沒用。若是你關心移植性,那你最好老是明確聲明精度和比例。)

若是一個要存儲的數值的比例比字段聲明的比例高, 那麼系統將嘗試圓整(四捨五入)該數值到指定的小數位。 而後,若是小數點左邊的數據位數超過了聲明的精度減去聲明的比例, 那麼拋出一個錯誤。

數值數據值物理上是不帶任何前導或者後綴零的形式存儲的。 所以,字段上聲明的精度和比例都是最大值,而不是固定分配的。 (在這個方面,numeric 類型更相似於 varchar(n), 而不像 char(n)。) 實際存儲是每四個十進制位兩個字節,而後在整個數據上加上八個字節的額外開銷。

除了普通的數字值以外,numeric 類型容許特殊值 NaN, 表示"不是一個數字"。任何在 NaN 上面的操做都生成另一個 NaN。 若是在 SQL 命令裏把這些值看成一個常量寫,你必須在其周圍放上單引號,好比 UPDATE table SET x = 'NaN'。在輸入時,字串 NaN看成大小寫無關看待。

類型 decimal 和 numeric 是等效的。 兩種類型都是SQL標準。

8.1.3. 浮點數類型

數據類型 real 和 double precision 是不許確的,變精度的數字類型。 實際上,這些類型是 IEEE 標準 754 二進制浮點數算術(分別對應單和雙精度)的通常實現, 外加下層處理器,操做系統和編譯器對它的支持。

不許確意味着一些數值不能準確地轉換成內部格式而且是以近似的形式存儲的,所以存儲而後把數據再打印出來可能顯示一些缺失。 處理這些錯誤以及這些錯誤是如何在計算中傳播的屬於數學和計算機科學的一個完整的分支, 咱們不會在這裏進一步討論它,這裏的討論僅限於以下幾點:

 

 

  • 若是你要求準確的計算(好比計算貨幣金額),應使用 numeric 類型。

  • 若是你想用這些類型作任何重要的複雜計算,尤爲是那些你對範圍狀況(無窮,下溢)嚴重依賴的事情,那你應該仔細評詁你的實現。

  • 拿兩個浮點數值進行相等性比較可能象,也可能不象想像那樣運轉。

 

一般,real 類型的範圍是至少 -1E+37 到 +1E+37, 精度至少是 6 位小數。double precision 類型一般有 -1E+308 到 +1E+308 的範圍,精度是至少 15 位數字。太大或者過小的數值都會致使錯誤。 若是輸入數據過高,那麼可能發生園整。太接近零的數字,若是沒法與零值的表現形式相區分就會產生下溢錯。

除了普通的數字值以外,浮點類型還有幾個特殊值:

Infinity
-Infinity
NaN

這些值分別表示 IEEE 754 特殊值 "正無窮大","負無窮大", 以及"不是一個數字"。(在不遵循 IEEE 754 浮點算術的機器上,這些值的含義可能不是預期的。) 若是在 SQL 命令裏把這些數值看成常量寫,你必須在它們周圍放上單引號, 像這樣 UPDATE table SET x = 'Infinity'。 輸入時,這些值是以大小寫無關的方式識別的。

 

PostgreSQL 還支持 SQL 標準表示法 float 和 float(p) 用於聲明非精確的數值類型。 在這裏,p 聲明以二進制位表示的最低可接受精度。 在選取 real 類型的時候,PostgreSQL 接受 float(1) 到 float(24),在選取 double precision 的時候,接受 float(25) 到 float(53)。在容許範圍以外的 p 值將致使一個錯誤。 沒有聲明精度的 float 將被看成是 double precision

注意: 在 PostgreSQL 7.4 之前,在 float(p) 裏面的精度會被看成是這麼多位數的十進制位。到 7.4 已經被修改爲與 SQL 標準匹配,標準聲明這個精度是以二進制位度量的。假設 real 和 double precision 分別有 24 和 53 個二進制位的位數對 IEEE 標準的浮點實現來講是正確的。 在非 IEEE 平臺上,這個數值可能略有誤差,可是爲了簡化,咱們在全部平臺上都用了一樣的 p 值範圍。

8.1.4. Serial(序號)類型

serial 和 bigserial 類型不是真正的類型, 只是爲在表中設置惟一標識作的概念上的便利。(相似其它一些數據庫中的 AUTO_INCREMENT 屬性)。 在目前的實現中,下面一句話:

CREATE TABLE tablename (
	colname SERIAL
);

等價於聲明下面幾句話:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename(
	colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL
);

所以,咱們就建立了一個整數字段而且把它的缺省數值安排爲從一個序列發生器取值。 應用了一個 NOT NULL 約束以確保空值不會被明確地插入。 在大多數狀況下你可能還但願附加一個 UNIQUE 或者 PRIMARY KEY 約束避免意外地插入重複的數值,但這個不是自動發生的。

注意: 在 PostgreSQL 7.3 之前,serial 隱含 UNIQUE。但如今再也不如此。 若是你但願一個序列字段有一個惟一約束或者一個主鍵,那麼你如今必須聲明,就像其它數據類型同樣。

要使用 serial 字段插入序列的下一個數值到表中, 主要是要注意 serial 應該賦予缺省值。 咱們能夠經過在 INSERT 語句中把該字段排除在字段列表以外來實現, 也能夠經過使用 DEFAULT 關鍵字來實現。

類型名 serial 和 serial4 是等效的: 兩個都建立 integer 字段。類型名 bigserial 和 serial8 也同樣,只不過它建立一個 bigint 字段。 若是你預計在表的生存期中使用的標識數目超過 231 個,那麼你應該使用 bigserial

一個 serial 類型建立的序列在所屬的字段被刪除的時候自動刪除,其它狀況下是不會被刪除的。 (這一點在 PostgreSQL 版本 7.3 以前可不是真的。請注意,這種自動刪除的關聯在經過重載 7.3 之前的數據庫轉儲的時候可不會自動發生; 那樣的轉儲文件不包含須要創建這種關聯關係的信息。) 另外,這樣的序列和字段之間的依賴性只在 serial 字段自己上有; 若是任何其它字段引用了序列(多是手工調用 nextval 函數), 那麼,若是這個序列被刪除了,它們就會被破壞。咱們認爲這樣使用 serial 字段是一種很差的形式;若是你想用同一個序列發生器給幾個字段喂數據,那麼仍是把序列發生器做爲獨立對象建立。

相關文章
相關標籤/搜索