PostgreSQL包括整數類型和浮點數類型。數據庫
整數類型包括3種,分別是smallint、int和bigint。別名分別是int二、int(int4)和int8.經常使用數據類型是int(integer)。post
浮點類型分爲精確浮點數類型numeric和不精確浮點數類型real(單精度浮點數據類型)和 double precision(雙精度浮點數據類型)。code
精確浮點數類型能夠用numeric(precision, scale)表示。ci
精度(precision)必須是正值,標度(scale)爲零或正值。類型numeric和decimal等價,都符合SQL標準。 numeric不帶精度和標度,則系統使用任意精度,不會超過數據庫系統儲存範圍。建立表顯示聲明精度最大值爲1000。it
numeric(precision, 0)等價於numeric(precision)。io
---不限定精度和標度 postgres=# create table testdecimal(id int,testvalue decimal); CREATE TABLE postgres=# insert into testdecimal values(1,777777777.77777777); INSERT 0 1 postgres=# insert into testdecimal values(1,777777777.7777777788888888888888); INSERT 0 1 postgres=# select * from testdecimal; id | testvalue ----+---------------------------------- 1 | 777777777.77777777 1 | 777777777.7777777788888888888888 (2 行記錄) postgres=# ---限定精度 postgres=# create table testnumeric(id int,testnumeric numeric(3)); CREATE TABLE postgres=# insert into testnumeric values(1,2.777); INSERT 0 1 postgres=# postgres=# postgres=# insert into testnumeric values(1,2.7777); INSERT 0 1 postgres=# insert into testnumeric values(1,2.77777); INSERT 0 1 postgres=# select * from testnumeric; id | testnumeric ----+------------- 1 | 3 1 | 3 1 | 3 (3 行記錄) ---限定標度 postgres=# create table testnumeric(id int,testnumeric numeric(2,2)); CREATE TABLE postgres=# insert into testnumeric values(1,0); INSERT 0 1 postgres=# insert into testnumeric values(1,0.1); INSERT 0 1 postgres=# insert into testnumeric values(1,1.1); 錯誤: 數字字段溢出 描述: 精度爲2,範圍是2的字段必須四捨五入到小於1的絕對值. postgres=#
根據查詢結果可知,不限制精度和標度,數據庫系統會「原樣儲存」,限定精度,將致使四捨五入運算。限定標度,插入超範圍數值將致使錯誤。table
numeric類型容許特殊值NaN, 表示"不是一個數字(not a number)"。插入NaN時須要使用單引號,不區分大小寫。PostgreSQL把NaN值視爲相等,而且比全部非NaN值都要大。test
---練習NaN使用。 postgres=# create table testnumeric(id int,testnumeric numeric); CREATE TABLE postgres=# insert into testnumeric values(2,'NaN'); INSERT 0 1 postgres=# insert into testnumeric values(2,'Nan'); INSERT 0 1 postgres=# insert into testnumeric values(2,'nan'); INSERT 0 1 postgres=# select * from testnumeric; id | testnumeric ----+------------- 2 | NaN 2 | NaN 2 | NaN (3 行記錄) postgres=# select 'NaN'::decimal >'Nan'::decimal; ?column? ---------- f (1 行記錄) postgres=# select 'NaN'::decimal <'Nan'::decimal; ?column? ---------- f (1 行記錄) postgres=# select 'NaN'::decimal ='Nan'::decimal; ?column? ---------- t (1 行記錄)
浮點數據類型分爲real(單精度浮點數據類型)和 double precision(雙精度浮點數據類型),都是不許確和變精度數據類型。不許確意味着某些值不能被正確轉換或被近似處理,在檢索或儲存時出現缺失,如何處理本文再也不詳加討論。不過咱們須要注意如下幾點select
一、要求精度數據(例如貨幣)使用numeric數據類型。數據類型
二、使用不精確可變精度數據類型須要詳細評估。
三、用兩個浮點數值進行等值比較不可能老是按照指望地進行。
不精確可變精度浮點數據類型除支持通常浮點數之外,還支持3個特殊值,分別是infinity,-infinity和NaN。
嚴格意義來說,序列(serial)不是數據類型,只是爲表示序數方便所創造。
---建立序列 postgres=# create table testserial (id serial); CREATE TABLE postgres=# ---另外一種等價建立序列 postgres=# create sequence testserial_id_sequence; CREATE SEQUENCE postgres=# postgres=# create table testserial(id int default nextval('testserial_id_sequence')); CREATE TABLE postgres=# postgres=# alter sequence testserial_id_sequence owned by testserial.id; ALTER SEQUENCE postgres=#
數據類型serial和serial4等效。當預期序號系列超過2^31時,使用bigserial(serial8)。
使用序列時應避免如下狀況。
postgres=# drop table testserial; DROP TABLE postgres=# create table testserial(id serial4,name text); CREATE TABLE postgres=# insert into testserial values(1,'Tom'),(100,'Bill'),(2,'Lily'); INSERT 0 3 postgres=# postgres=# select id , name from testserial; id | name -----+------ 1 | Tom 100 | Bill 2 | Lily (3 行記錄) postgres=#
建議使用
postgres=# insert into testserial(name) values('Tom'),('Bill'),('Lily'); INSERT 0 3 postgres=# select id , name from testserial; id | name -----+------ 1 | Tom 100 | Bill 2 | Lily 1 | Tom 2 | Bill 3 | Lily (6 行記錄) postgres=#
更多細節,建議參考PostgreSQL手冊。