PostgreSQL數值類型--浮點類型和序列

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手冊。

相關文章
相關標籤/搜索