1. 程式人生 > >PostgreSql 常見資料型別

PostgreSql 常見資料型別

1.CREATE TYPE 命令增加新的資料型別

2.資料型別

名字別名描述
bigint int8 有符號 8 位元組整數
bigserial serial8 自增 8 位元組整數
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 有符號 4 位元組整數
interval [ (p) ] 時間間隔
line 平面中的無限長直線
lseg 平面中的線段
macaddr MAC 地址
money 貨幣金額
numeric [ (ps) ] decimal [ (ps) ] 可選精度的準確數字
path 平面中的幾何路徑
point 平面中的點
polygon 平面中的封閉幾何路徑
real
float4 單精度浮點數
smallint int2 有符號 2 位元組整數
serial serial4 自增 4 位元組整數
text 變長字串
time [ (p) ] [ without time zone ] 一天中的時間
time [ (p) ] with time zone timetz 一天裡的時間,包括時區
timestamp [ (p) ] [ without time zone ] 日期和時間
timestamp [ (p) ] with time zone timestamptz 日期和時間,包括時區

3.數值型別

名字儲存空間描述範圍
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

3. 整數型別
smallint, integer, bigint 型別儲存各種範圍的全部是數字的數,也就是沒有小數部分的數字。試圖儲存超出範圍以外的數值將導致一個錯誤。

常用的型別是 integer ,因為它提供了在範圍、儲存空間、效能之間的最佳平衡。一般只有在磁碟空間緊張的時候才使用 smallint 。而只有在 integer 的範圍不夠的時候才使用 bigint ,因為前者絕對快得多。

bigint 型別可能不是在所有平臺上都運轉正確,因為它依賴編譯器對八位元組整數的支援。在那些沒有八位元組整數支援的機器上,bigint 的作用和 integer 一樣(但是仍然佔據八位元組儲存)。不過,我們目前還沒聽說過有這樣的平臺。

SQL 只聲明瞭整數型別 integer(或 int) 和 smallint 。型別 bigint 和類型別名 int2, int4, int8 都是擴充套件,並且也在許多其它 SQL 資料庫系統中使用。

4.任意精度數值
numeric 型別可以儲存最多 1000 位精度的數字並且準確地進行計算。特別建議將它用於貨幣金額和其它要求精確計算的場合。不過,numeric 型別上的算術運算比整數型別要慢很多。

術語:一個 numeric 型別的標度(scale)是小數部分的位數,精度(precision)是全部資料位的數目,也就是小數點兩邊的位數總和。因此數字 23.5141 的精度為 6 而標度為 4 。你可以認為整數的標度為零。

numeric 欄位的最大精度和最大標度都是可以配置的。要宣告一個欄位的型別為 numeric ,你可以用下面的語法:

NUMERIC(precision, scale)
精度必須為正數,標度可以為零或者正數。另外,

NUMERIC(precision)
選擇了標度為 0 。不帶任何精度與標度的宣告

NUMERIC
則建立一個可以儲存一個直到實現精度上限的任意精度和標度的數值,一個這樣型別的欄位將不會把輸入數值轉化成任何特定的標度,而帶有標度宣告的 numeric 欄位將把輸入值轉化為該標度。SQL 標準要求預設的標度是 0(也就是轉化成整數精度)。如果你關心移植性,那你最好總是明確宣告精度和標度。

如果一個要儲存的數值的標度比欄位宣告的標度高,那麼系統將嘗試圓整(四捨五入)該數值到指定的小數位。然後,如果小數點左邊的資料位數超過了宣告的精度減去宣告的標度,那麼將丟擲一個錯誤。

numeric 型別的資料值在物理上是不帶任何前導或者字尾零的形式儲存的。因此,欄位上宣告的精度和標度都是最大值,而不是固定分配的。在這個方面,numeric 型別更類似於 varchar(n) 而不是 char(n) 。實際儲存是每四個十進位制位兩個位元組,然後在整個資料上加上八個位元組的額外開銷。

除了普通的數字值之外,numeric 型別允許用特殊值 NaN 表示"不是一個數字"。任何在 NaN 上面的操作都生成另外一個 NaN 。如果在 SQL 命令裡把這些值當作一個常量寫,你必須在其周圍放上單引號,比如 UPDATE table SET x = 'NaN' 。在輸入時,字串 NaN 是大小寫無關的。

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

5.浮點數型別
資料型別 real 和 double precision 是不精確的、變精度的數字型別。
如果你要求精確的計算(比如計算貨幣金額),應使用 numeric 型別。

如果你想用這些型別做任何重要的複雜計算,尤其是那些你對範圍情況(無窮/下溢)嚴重依賴的事情,那你應該仔細評詁你的實現。

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

在大多數平臺上,real 型別的範圍是至少 1E-37 到 1E+37 ,精度至少是 6 位小數。double precision 的範圍通常是 1E-307 到 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 值範圍。

6.序列號型別
serial 和 bigserial 型別不是真正的型別,只是為在表中設定唯一標識做的概念上的便利。類似其它一些資料庫中的 AUTO_INCREMENT 屬性。在目前的實現中,下面一個語句:

CREATE TABLE tablename (
    colname SERIAL
);
等價於宣告下面幾個語句:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
因此,我們就建立了一個整數字段並且把它的預設數值安排為從一個序列發生器讀取。應用了一個 NOT NULL 約束以確保 NULL 不會被插入。在大多數情況下你可能還希望附加一個 UNIQUE 或 PRIMARY KEY 約束避免意外地插入重複的數值,但這個不是自動的。最後,將序列發生器"從屬於"那個欄位,這樣當該欄位或表被刪除的時候也一併刪除它。

【注意】PostgreSQL 7.3以前,serial 隱含 UNIQUE 。但現在不再如此。如果你希望一個序列欄位有一個唯一約束或者一個主鍵,那麼你現在必須宣告,就像其它資料型別一樣。

要在 serial欄位中插入序列中的下一個數值,主要是要注意 serial欄位應該賦予預設值。我們可以通過在 INSERT 語句中把該欄位排除在欄位列表之外來實現,也可以通過使用 DEFAULT 關鍵字來實現。

型別名 serial 和 serial4 是等效的:兩者都建立 integer 欄位。型別名 bigserial 和 serial8 也一樣,只不過它建立一個 bigint 欄位。如果你預計在表的生存期中使用的標識數目可能超過 231 個,那麼你應該使用 bigserial 。

一個 serial 型別建立的序列在所屬的欄位被刪除的時候自動刪除。你可以只刪除序列而不刪除欄位,不過這將刪除該欄位的預設值表示式。