1.1 資料型別
PostgreSQL 有著豐富的資料型別可用, 用戶可以使用 CREATE TYPE 命令為 PostgreSQL 增加新的資料型別,
Table1-1顯示了所有內置的普通資料型別, 在"別名"列里列出的大多數可選名字都是因歷史原因 PostgreSQL 在內部使用的名字,
另外,還有一些內部使用的或者廢棄的型別也可以用,但沒有在這里列出,
Table1-1: 資料型別
| 名字 | 別名 | 描述 |
|---|---|---|
| bigint | int8 | 有符號 8 位元組整數 |
| bigserial | serial8 | 自增八位元組整數 |
| 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 | int,int4 | 四位元組長有符號整數 |
| interval [ (p) ] | 時間間隔 | |
| line | 平面中的無限長直線 | |
| lseg | 平面中的線段 | |
| macaddr | MAC 地址 | |
| money | 貨幣金額 | |
| numeric [ (p, s) ] | decimal [ (p, s) ] | 可選精度的準確數字 |
| path | 平面中的幾何路徑 | |
| point | 平面中的點 | |
| polygon | 平面中的封閉幾何路徑 | |
| real | float4 | 單精度浮點數 |
| smallint | int2 | 有符號兩位元組整數 |
| serial | serial4 | 自增四位元組整數 |
| text | 變長字串 | |
| time [ (p) ] [ without time zone ] | 一天里的時間 | |
| time [ (p) ] with time zone | timetz | 一天里的時間,包括時區 |
| timestamp [ (p) ] [ without time zone ] | 日期和時間 | |
| timestamp [ (p) ] with time zone | timestamptz | 日期和時間 |
兼容性: 下列型別(或者那樣拼寫的)是SQL宣告的: bit,bit varying,boolean, char,character,character varying,varchar,date, double precision,integer, interval,numeric,decimal, real,smallint,time (包括有時區和無時區的), timestamp (包括有時區和無時區的),
每種資料型別都有一個由其輸入和輸出函式決定的外部表現形式, 許多內建的型別有明顯的格式,不過,許多型別要么是 PostgreSQL 所特有的,比如幾何路徑,要么可能是有幾種不同的格式,比如日期和時間型別, 有些輸入和輸出函式是不可逆的,也就是說,輸出函式的輸出結果和原始的輸入比較的時候可能丟失精度,
在創建pgsql資料庫表時,如果要給主鍵設定資料型別可以參考上表資料名稱,例如,在創建表sl_log_exception時,主鍵id設定資料型別為serial,創建完成查看表結構主鍵id,會顯示索引,


1.2 數值型別
數值型別由2、4或8位元組的整數以及4或8位元組的浮點數和可選精度小陣列成, Table 1-2 列出了所有可用型別,
Table 1-2. 數值型別
| 名字 | 存盤空間 | 描述 | 范圍 |
|---|---|---|---|
| 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 |
1.2.1. 整數型別
型別 smallint,integer,和 bigint 存盤各種范圍的全部是數字的數,也就是沒有小數部分的數字, 如果存盤超出范圍以外的數值將導致錯誤,
常用的型別是 integer,因為它提供了在范圍,存盤空間, 和性能之間的最佳平衡,一般只有在磁盤空間緊張的時候才使用 smallint,而只有在 integer 的范圍不夠的時候才使用 bigint,
bigint 型別可能不是在所有平臺上都運轉正確, 因為它依賴編譯器對八位元組整數的支持,在那些沒有這樣支持的機器上, bigint 的作用和 integer 一樣(但是仍然占據八位元組存盤),
SQL只宣告了整數型別 integer(或int)和 smallint,型別 bigint,和型別名 int2,int4,和 int8 都是擴展, 也在許多其它 SQL 資料庫系統中使用,
1.2.2. 任意精度數值
型別 numeric 可以存盤最多1000位精度的數字并且準確地進行計算, 我們特別建議將它用于貨幣金額和其它要求計算準確的數量,不過,numeric 型別上的算術運算比整數型別或者浮點數型別要慢很多,
numeric 欄位的最大精度和最大比例都是可以配置的,要宣告一個型別為 numeric 的欄位,你可以用下面的語法
NUMERIC(precision, scale)
精度必須為正數,比例可以為零或者正數, 另外,
NUMERIC(precision)
選擇了 0 為比例,不帶任何精度或者比例宣告
NUMERIC
則創建一個可以存盤一個直到實作精度上限的任意精度和比例的數值, 一個這樣型別的欄位將不會把輸入數值轉化成任何特定的比例, 而帶有比例宣告的 numeric 欄位將把輸入值轉化為該比例,(SQL標準要求預設的比例是 0,也就是轉化成整數精度,)
如果一個要存盤的數值的比例比欄位宣告的比例高, 那么系統將嘗試圓整(四舍五入)該數值到指定的小數位, 然后,如果小數點左邊的資料位數超過了宣告的精度減去宣告的比例, 那么會拋出一個錯誤,
數值資料值物理上是不帶任何前導或者后綴零的形式存盤的, 因此,欄位上宣告的精度和比例都是最大值,而不是固定分配的,(在這個方面,numeric 型別更類似于 varchar(n), 而不像 char(n),) 實際存盤是每四個十進制位兩個位元組,然后在整個資料上加上八個位元組的額外開銷,
除了普通的數字值之外,numeric 型別允許特殊值 NaN, 表示"不是一個數字",任何在 NaN 上面的操作都生成另外一個 NaN, 如果在 SQL 命令里把這些值當作一個常量寫,你必須在其周圍放上單引號,比如 UPDATE table SET x = 'NaN',在輸入時,字串 NaN當作大小寫無關看待,
型別 decimal 和 numeric 是等效的, 兩種型別都是SQL標準,
1.2.3. 浮點數型別
資料型別 real 和 double precision 是不準確的,變精度的數字型別, 實際上,這些型別是 IEEE 標準 754 二進制浮點數算術(分別對應單和雙精度)的一般實作, 外加下層處理器,作業系統和編譯器對它的支持,
不準確意味著一些數值不能準確地轉換成內部格式并且是以近似的形式存盤的,因此存盤然后把資料再列印出來可能顯示一些缺失, 處理這些錯誤以及這些錯誤是如何在計算中傳播的屬于數學和計算機科學的一個完整的分支, 這里的討論僅限于如下幾點:
-
如果你要求準確的計算(比如計算貨幣金額),應使用 numeric 型別,
-
如果你想用這些型別做任何重要的復雜計算,尤其是那些你對范圍情況(無窮,下溢)嚴重依賴的事情,那你應該仔細評詁你的實作,
-
拿兩個浮點數值進行相等性比較可能象,也可能不象想像那樣運轉,
通常,real 型別的范圍是至少 -1E+37 到 +1E+37, 精度至少是 6 位小數,double precision 型別通常有 -1E+308 到 +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 值范圍,
1.2.4. Serial(序號)型別
serial 和 bigserial 型別不是真正的型別, 只是為在表中設定唯一標識做的概念上的便利,(類似其它一些資料庫中的 AUTO_INCREMENT 屬性),下面一句話:
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 約束避免意外地插入重復的數值,但這個不是自動發生的,
注意: 在 PostgreSQL 7.3 以前,serial 隱含 UNIQUE,但現在不再如此, 如果你希望一個序列欄位有一個唯一約束或者一個主鍵,那么你現在必須宣告,就像其它資料型別一樣,
要使用 serial 欄位插入序列的下一個數值到表中, 主要是要注意 serial 應該賦予預設值, 我們可以通過在 INSERT 陳述句中把該欄位排除在欄位串列之外來實作, 也可以通過使用 DEFAULT 關鍵字來實作,
型別名 serial 和 serial4 是等效的: 兩個都創建 integer 欄位,型別名 bigserial 和 serial8 也一樣,只不過它創建一個 bigint 欄位, 如果你預計在表的生存期中使用的標識數目超過 231 個,那么你應該使用 bigserial,
一個 serial 型別創建的序列在所屬的欄位被洗掉的時候自動洗掉,其它情況下是不會被洗掉的, (這一點在 PostgreSQL 版本 7.3 之前可不是真的,請注意,這種自動洗掉的關聯在通過多載 7.3 以前的資料庫轉儲的時候可不會自動發生; 那樣的轉儲檔案不包含需要建立這種關聯關系的資訊,) 另外,這樣的序列和欄位之間的依賴性只在 serial 欄位本身上有; 如果任何其它欄位參考了序列(可能是手工呼叫 nextval 函式), 那么,如果這個序列被洗掉了,它們就會被破壞,我們認為這樣使用 serial 欄位是一種不好的形式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1173.html
標籤:PostgreSQL
