postgresql數字類型

postgresql的數據類型不少,也可使用create type命令建立自定義數據類型,但經常使用的數據類型是如下三種: sql

l  數字數據類型 數據庫

l  字符串數據類型 緩存

l  日期/時間數據類型 less

 

數字數據類型 post

數字數據類型用於指定表中的數字數據,詳情以下表所示: spa

名稱 postgresql

描述 orm

存儲大小 排序

範圍 索引

smallint

存儲整數,小範圍

2字節

-32768 +32767

integer

存儲整數。使用這個類型可存儲典型的整數

4字節

-2147483648 +2147483647

bigint

存儲整數,大範圍。

8字節

-9223372036854775808 9223372036854775807

decimal

用戶指定的精度,精確

變量

小數點前最多爲131072個數字; 小數點後最多爲16383個數字。

numeric

用戶指定的精度,精確

變量

小數點前最多爲131072個數字; 小數點後最多爲16383個數字。

real

可變精度,不精確

4字節

6位數字精度

double precision

可變精度,不精確

8字節

15位數字精度

smallserial

自動遞增的小整數

2字節

132767

serial

自動遞增整數

4字節

1 2147483647

bigserial

大的自動遞增整數

8字節

1 9223372036854775807

 

數字類型又能夠分爲四類

1.  整數類型

類型smallintintegerbigint只能保存整數,也就是沒有小數部分。若是試圖在整數類型中保存超過範圍的整數,數據庫將會報錯。例:

mydb=# INSERT into test VALUES(32767);

INSERT 0 1

mydb=# INSERT into test VALUES(32768);

ERROR:  smallint out of range

mydb=# SELECT * from test;

 smallint1

-----------

     32767

(1 row)

 

2.  任意精度數值

numeric類型最多能存儲有1000個數字位的數字而且能進行準確的數值計算。它主要用於須要準確地表示數字的場合,如貨幣金額。不過,對numeric 類型進行算術運算比整數類型和浮點類型要慢不少。

numeric類型有兩個術語,分別是標度和精度。numeric類型的標度(scale)是到小數點右邊全部小數位的個數, numeric 的精度(precision)是全部數字位的個數,例如,23.5141 的精度是6而標度爲4。能夠認爲整數的標度是零。

numeric 類型的最大精度和最大標度都是能夠配置的。能夠用下面的語法定義一個numeric類型:

a)      NUMERIC(precision, scale)

b)      NUMERIC(precision)

c)      NUMERIC

精度必須爲正數,標度能夠爲零或正數。在上面的第二種語法中沒有指定標度,則系統會將標度設爲0,因此NUMERIC(precision,0)NUMERIC(precision)是等價的。第三種類型的語法沒有指定精度和標度,則這種類型的列能夠接受任意精度和標度的numeric數據(在系統能表示的最大精度範圍內),而不會對輸入的數據進行精度或標度的變換。若是一個列被定義成numeric類型並且指定了標度,那麼輸入的數據將被強制轉換成這個標度(若是它的標度比定義列的numeric的標度大),進行標度轉換時的規則是四捨五入。若是輸入的數據進行標度轉換後獲得的數據在小數點左邊的數據位的個數超過了列的類型的精度減去標度的差,系統將會報錯。例:

--構建環境

CREATE TABLE test (numeric1 numeric(3,3));

--插入超過精度和標度的值

INSERT into test VALUES(1.3456);

--報錯信息

ERROR:  numeric field overflow

DETAIL:  A field with precision 3, scale 3 must round to an absolute value less than 1.

--插入超過標度的值,超過標度的部分被四捨五入成小於1的數。

INSERT into test VALUES(0.3455);

INSERT into test VALUES(0.3454);

SELECT * from test;

 numeric1

----------

    0.346

    0.345

numeric 類型能夠接受一個特殊的值NaNNot a Number),它的意思是不是一個數字"。任何在 NaN 上面的操做都生成另一個 NaN 若是在 SQL 命令裏把這些值看成一個常量寫,必須把它用單引號引發來,好比 UPDATE table SET x = 'NaN'。在輸入時,NaN的大小寫可有可無。例:

INSERT into test values('NaN');

SELECT * from test;

numeric1

----------

    0.346

    0.345

      NaN

注意:在其它的數據庫中,NaN和任何的數值數據都不相等,兩個NaN也是不相等的,在postgresSQL中,爲了容許numeric值能夠被排序和使用基於樹的索引,PostgreSQLNaN值視爲相等,而且比全部非NaN值都要大。例:

SELECT * from test where numeric1='NaN';

 numeric1

----------

      NaN

 

SELECT * from test t1,test t2 where t1.numeric1=t2.numeric1;

 numeric1 | numeric1

----------+----------

    0.345 |    0.345

    0.346 |    0.346

      NaN |      NaN

 

SELECT * from test where NUMERIC1>10;

 numeric1

----------

      NaN

3.  浮點類型

數據類型 real double precision 表示不許確的變精度的數字。不許確意味着一些值不能準確地轉換成內部格式而且是以近似的形式存儲的,存儲在數據庫裏的只是它們的近似值。若是要求準確地保存某些數值(好比計算貨幣金額),應使 numeric 類型。另外,比較兩個浮點數是否相等時,可能會獲得意想不到的結果。例:

create table test(real1 real)

insert into test VALUES(1.6666666);

insert into test VALUES(1.666666);

insert into test VALUES(1.66666);

SELECT * FROM test;

  real1 

---------

 1.66667

 1.66667

 1.66666

(3 rows)

 

mydb=# SELECT * from test where real1=1.66666;            --等值運算未能獲取到想要的數據

 real1

-------

(0 rows)

 

mydb=# SELECT * from test where real1=1.66667;           --等值運算未能獲取到想要的數據

 real1

-------

(0 rows)

 

mydb=# SELECT * from test where real1>1.66666;

  real1 

---------

 1.66667

 1.66667

(2 rows)

 

mydb=# SELECT * from test where real1>1.6666;

  real1 

---------

 1.66667

 1.66667

 1.66666

(3 rows)

浮點類型還有幾個特殊值:Infinity-InfinityNaN。這些值分別表示 IEEE 754標準中的特殊值"正無窮大""負無窮大" 以及"不是一個數字"。若是在 SQL 命令裏把這些數值看成常量寫,必須在它們用單引號引發來,例如UPDATE table SET x = 'Infinity' 輸入時,這些值的大小寫可有可無。

PostgreSQL 還支持 SQL 標準中定義的類型floatfloat(p)p 定義以二進制位表示的最低能夠接受的精度,p的取值在153之間。實際上,若是p的取值在124之間,float(p)被當作是real類型,若是p的取值在2553之間,float(p)被當作是double precision類型。不帶精度的float被當作是double precision類型。

4.  Postgresql的序列

Postgresql中的序列做爲數據類型存在,smallserialserialbigserial並非真正的類型,只是爲了建立惟一標識符而存在的符號。

建立序列的兩種方式

1、直接在表中指定字段類型爲smallserialserialbigserial

CREATE table test(text varchar,serial1 serial);

INSERT into test VALUES('');

INSERT into test VALUES('');

INSERT into test VALUES('');

INSERT into test VALUES('');

mydb=# Select * from test;

 text | serial1

------+---------

    |       1

    |       2

    |       3

    |       4

(4 rows)

 

2、先建立序列名稱,而後在新建表中指定相關列的屬性,該列須要int類型。

序列建立語法

CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]

    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]

    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

    [ OWNED BY { table.column | NONE } ]

例:

--建立一個步長爲10,最小值爲1,初始值爲17,緩存爲100,可循環的使用的序列

create sequence test_id_seq increment by 10 minvalue 1 no maxvalue start with 17 cache 100  cycle;

--查看序列的屬性,兩種方式,使用psql\d查看,或直接查詢序列名稱

mydb=# \d test_id_seq

         Sequence "public.test_id_seq"

    Column     |  Type   |        Value       

---------------+---------+---------------------

 sequence_name | name    | test_id_seq

 last_value    | bigint  | 17

 start_value     | bigint  | 17

 increment_by | bigint  | 10

 max_value     | bigint  | 9223372036854775807

 min_value      | bigint  | 1

 cache_value  | bigint  | 100

 log_cnt           | bigint  | 0

 is_cycled        | boolean | t

 is_called         | boolean | f

 

mydb=# SELECT * from test_id_seq;

 sequence_name | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called

---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------

 test_id_seq   |       1007 |          17 |           10 | 9223372036854775807 |         1 |         100 |      32 | t         | t

(1 row)

 

--建立一個使用上述序列的表

create table test(wenzi varchar,id int4 not null DEFAULT nextval('test_id_seq'));

--爲表中不使用序列的列插入數據

INSERT into test VALUES('');

INSERT into test VALUES('');

INSERT into test VALUES('');

INSERT into test VALUES('');

--查詢插入後的數據

mydb=# select * from test;

 wenzi | id

-------+----

     | 17

     | 27

     | 37

     | 47

(4 rows)

相關文章
相關標籤/搜索