1、數值類型:
下面是PostgreSQL所支持的數值類型的列表和簡單說明: 數據庫
名字 | 存儲空間 | 描述 | 範圍 |
smallint | 2 字節 | 小範圍整數 | -32768 到 +32767 |
integer | 4 字節 | 經常使用的整數 | -2147483648 到 +2147483647 |
bigint | 8 字節 | 大範圍的整數 | -9223372036854775808 到 9223372036854775807 |
decimal | 變長 | 用戶聲明精度,精確 | 無限制 |
numeric | 變長 | 用戶聲明精度,精確 | 無限制 |
real | 4 字節 | 變精度,不精確 | 6 位十進制數字精度 |
double | 8 字節 | 變精度,不精確 | 15 位十進制數字精度 |
serial | 4 字節 | 自增整數 | 1 到 +2147483647 |
bigserial | 8 字節 | 大範圍的自增整數 | 1 到 9223372036854775807 |
1. 整數類型:
類型smallint、integer和bigint存儲各類範圍的所有是數字的數,也就是沒有小數部分的數字。試圖存儲超出範圍之外的數值將致使一個 錯誤。經常使用的類型是integer,由於它提供了在範圍、存儲空間和性能之間的最佳平衡。通常只有在磁盤空間緊張的時候才使用smallint。而只有在 integer的範圍不夠的時候才使用bigint,由於前者(integer)絕對快得多。
2. 任意精度數值:
類型numeric能夠存儲最多1000位精度的數字而且準確地進行計算。所以很是適合用於貨幣金額和其它要求計算準確的數量。不過,numeric類型上的算術運算比整數類型或者浮點數類型要慢不少。
numeric字段的最大精度和最大比例都是能夠配置的。要聲明一個類型爲numeric的字段,你能夠用下面的語法:
NUMERIC(precision,scale)
好比數字23.5141的精度爲6,而刻度爲4。
在目前的PostgreSQL版本中,decimal和numeric是等效的。
3. 浮點數類型:
數據類型real和double是不許確的、犧牲精度的數字類型。不許確意味着一些數值不能準確地轉換成內部格式而且是以近似的形式存儲的,所以存儲後再把數據打印出來可能顯示一些缺失。
4. Serial(序號)類型:
serial和bigserial類型不是真正的類型,只是爲在表中設置惟一標識作的概念上的便利。
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約束避免意外地插入重複的數值,但這個不是自動發生的。所以,若是你但願一個序列字段有一個惟一約束或者一個主鍵,那麼你如今必須聲明,就像其它數 據類型同樣。
還須要另外說明的是,一個serial類型建立的序列在其所屬字段被刪除時,該序列也將被自動刪除,可是其它狀況下是不會被刪除的。所以,若是你想用同一個序列發生器同時給幾個字段提供數據,那麼就應該以獨立對象的方式建立該序列發生器。
2、字符類型:
下面是PostgreSQL所支持的字符類型的列表和簡單說明: 數組
名字 | 描述 |
varchar(n) | 變長,有長度限制 |
char(n) | 定長,不足補空白 |
text | 變長,無長度限制 |
SQL 定義了兩種基本的字符類型,varchar(n)和char(n),這裏的n是一個正整數。兩種類型均可以存儲最多n個字符長的字串,試圖存儲更長的字串 到這些類型的字段裏會產生一個錯誤,除非超出長度的字符都是空白,這種狀況下該字串將被截斷爲最大長度。若是沒有長度聲明,char等於char(1), 而varchar則能夠接受任何長度的字串。
MyTest=> CREATE TABLE testtable(first_col varchar(2));
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES('333'); --插入字符串的長度,超過其字段定義的長度,所以報錯。
ERROR: value too long for type character varying(2)
--插入字符串中,超出字段定義長度的部分是空格,所以能夠插入,可是空白符被截斷。
MyTest=> INSERT INTO testtable VALUES('33 ');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
first_col
-----------
33
(1 row)
這裏須要注意的是,若是是將數值轉換成char(n)或者varchar(n),那麼超長的數值將被截斷成n個字符,而不會拋出錯誤。
MyTest=> select 1234::varchar(2);
varchar
---------
12
(1 row)
最後須要提示的是,這三種類型之間沒有性能差異,只不過是在使用char類型時增長了存儲尺寸。雖然在某些其它的數據庫系統裏,char(n)有必定的性能優點,但在PostgreSQL裏沒有。在大多數狀況下,應該使用text或者varchar。
3、日期/時間類型:
下面是PostgreSQL所支持的日期/時間類型的列表和簡單說明: 性能
名字 | 存儲空間 | 描述 | 最低值 | 最高值 | 分辨率 |
timestamp[無時區] | 8字節 | 包括日期和時間 | 4713 BC | 5874897AD | 1毫秒/14位 |
timestamp[含時區] | 8字節 | 日期和時間,帶時區 | 4713 BC | 5874897AD | 1毫秒/14位 |
interval | 12字節 | 時間間隔 | -178000000年 | 178000000年 | 1毫秒/14位 |
date | 4字節 | 只用於日期 | 4713 BC | 32767AD | 1天 |
time[無時區] | 8字節 | 只用於一日內時間 | 00:00:00 | 24:00:00 | 1毫秒/14位 |
1. 日期/時間輸入:
任何日期或者時間的文本輸入均須要由單引號包圍,就象一個文本字符串同樣。
1). 日期:
如下爲合法的日期格式列表: spa
例子 | 描述 |
January 8, 1999 | 在任何datestyle輸入模式下都無歧義 |
1999-01-08 | ISO-8601格式,任何方式下都是1999年1月8號,(建議格式) |
1/8/1999 | 歧義,在MDY下是1月8號;在 DMY模式下讀作8月1日 |
1/18/1999 | 在MDY模式下讀作1月18日,其它模式下被拒絕 |
01/02/03 | MDY模式下的2003年1月2日;DMY模式下的2003年2月1日;YMD 模式下的2001年2月3日 |
1999-Jan-08 | 任何模式下都是1月8日 |
Jan-08-1999 | 任何模式下都是1月8日 |
08-Jan-1999 | 任何模式下都是1月8日 |
99-Jan-08 | 在YMD模式下是1月8日,不然錯誤 |
08-Jan-99 | 1月8日,除了在YMD模式下是錯誤的以外 |
Jan-08-99 | 1月8日,除了在YMD模式下是錯誤的以外 |
19990108 | ISO-8601; 任何模式下都是1999年1月8日 |
990108 | ISO-8601; 任何模式下都是1999年1月8日 |
2). 時間:
如下爲合法的時間格式列表: 對象
例子 | 描述 |
04:05:06.789 | ISO 8601 |
04:05:06 | ISO 8601 |
04:05 | ISO 8601 |
040506 | ISO 8601 |
04:05 AM | 與04:05同樣;AM不影響數值 |
04:05 PM | 與16:05同樣;輸入小時數必須 <= 12 |
04:05:06.789-8 | ISO 8601 |
04:05:06-08:00 | ISO 8601 |
04:05-08:00 | ISO 8601 |
040506-08 | ISO 8601 |
3). 時間戳:
時間戳類型的有效輸入由一個日期和時間的聯接組成,後面跟着一個可選的時區。所以,1999-01-08 04:05:06和1999-01-08 04:05:06 -8:00都是有效的數值。
2. 示例:
1). 在插入數據以前先查看datestyle系統變量的值:
MyTest=> show datestyle;
DateStyle
-----------
ISO, YMD
(1 row)
2). 建立包含日期、時間和時間戳類型的示例表:
MyTest=> CREATE TABLE testtable (id integer, date_col date, time_col time, timestamp_col timestamp);
CREATE TABLE
3). 插入數據:
MyTest=> INSERT INTO testtable(id,date_col) VALUES(1, DATE'01/02/03'); --datestyle爲YMD
INSERT 0 1
MyTest=> SELECT id, date_col FROM testtable;
id | date_col
----+------------
1 | 2001-02-03
(1 row)
MyTest=> set datestyle = MDY;
SET
MyTest=> INSERT INTO testtable(id,date_col) VALUES(2, DATE'01/02/03'); --datestyle爲MDY
INSERT 0 1
MyTest=> SELECT id,date_col FROM testtable;
id | date_col
----+------------
1 | 2001-02-03
2 | 2003-01-02
MyTest=> INSERT INTO testtable(id,time_col) VALUES(3, TIME'10:20:00'); --插入時間。
INSERT 0 1
MyTest=> SELECT id,time_col FROM testtable WHERE time_col IS NOT NULL;
id | time_col
----+----------
3 | 10:20:00
(1 row)
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(4, DATE'01/02/03');
INSERT 0 1
MyTest=> INSERT INTO testtable(id,timestamp_col) VALUES(5, TIMESTAMP'01/02/03 10:20:00');
INSERT 0 1
MyTest=> SELECT id,timestamp_col FROM testtable WHERE timestamp_col IS NOT NULL;
id | timestamp_col
----+---------------------
4 | 2003-01-02 00:00:00
5 | 2003-01-02 10:20:00
(2 rows)
4、布爾類型:
PostgreSQL支持標準的SQL boolean數據類型。boolean只能有兩個狀態之一:真(True)或 假(False)。該類型佔用1個字節。
"真"值的有效文本值是:
TRUE
't'
'true'
'y'
'yes'
'1'
而對於"假"而言,你可使用下面這些:
FALSE
'f'
'false'
'n'
'no'
'0'
見以下使用方式:
MyTest=> CREATE TABLE testtable (a boolean, b text);
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES(TRUE, 'sic est');
INSERT 0 1
MyTest=> INSERT INTO testtable VALUES(FALSE, 'non est');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
a | b
---+---------
t | sic est
f | non est
(2 rows)
MyTest=> SELECT * FROM testtable WHERE a;
a | b
---+---------
t | sic est
(1 row)
MyTest=> SELECT * FROM testtable WHERE a = true;
a | b
---+---------
t | sic est
(1 row)
5、位串類型:
位串就是一串1和0的字串。它們能夠用於存儲和視覺化位掩碼。咱們有兩種類型的SQL位類型:bit(n)和bit varying(n); 這裏的n是一個正整數。bit類型的數據必須準確匹配長度n; 試圖存儲短些或者長一些的數據都是錯誤的。類型bit varying數據是最長n的變長類型;更長的串會被拒絕。寫一個沒有長度的bit等效於bit(1),沒有長度的bit varying至關於沒有長度限制。
針對該類型,最後須要提醒的是,若是咱們明確地把一個位串值轉換成bit(n),那麼它的右邊將被截斷或者在右邊補齊零,直到恰好n位,而不會拋出任何錯 誤。相似地,若是咱們明確地把一個位串數值轉換成bit varying(n),若是它超過n位,那麼它的右邊將被截斷。 見以下具體使用方式:
MyTest=> CREATE TABLE testtable (a bit(3), b bit varying(5));
CREATE TABLE
MyTest=> INSERT INTO testtable VALUES (B'101', B'00');
INSERT 0 1
MyTest=> INSERT INTO testtable VALUES (B'10', B'101');
ERROR: bit string length 2 does not match type bit(3)
MyTest=> INSERT INTO testtable VALUES (B'10'::bit(3), B'101');
INSERT 0 1
MyTest=> SELECT * FROM testtable;
a | b
-----+-----
101 | 00
100 | 101
(2 rows)
MyTest=> SELECT B'11'::bit(3);
bit
-----
110
(1 row) ci