PostgreSQL數據類型
本章討論PostgreSQL數據類型。在創建表的同時,要求每列都要指定數據類型,即什麼樣的數據要存儲在表中的字段。
這使幾個好處:
-
一致性: 對相同的數據類型的列的操作給出了一致的結果,通常是最快的。
-
驗證: 正確使用的數據類型表示數據和拒絕的範圍之外的數據類型的數據格式驗證。
-
壓縮: 作為一列可以存儲單一類型的值,它被存儲在一個緊湊的方式。
-
性能: 適當地使用的數據類型給出最有效的數據存儲。存儲的值可以被快速處理,從而提高性能。
PostgreSQL支持一係列廣泛的數據類型。此外,用戶可以使用SQL命令CREATE TYPE創建自己的自定義數據類型。在PostgreSQL中有不同類彆的數據類型。如下:
數值類型
數值類型由兩個字節,4字節和8字節的整數,4字節和8字節的浮點數和可選精度的小數。下表列出了可用的類型。
Name | Storage Size | Description | Range |
---|---|---|---|
smallint | 2 bytes | small-range integer | -32768 to +32767 |
integer | 4 bytes | typical choice for integer | -2147483648 to +2147483647 |
bigint | 8 bytes | large-range integer | -9223372036854775808 to 9223372036854775807 |
decimal | variable | user-specified precision,exact | up to 131072 digits before the decimal yiibai; up to 16383 digits after the decimal yiibai |
numeric | variable | user-specified precision,exact | up to 131072 digits before the decimal yiibai; up to 16383 digits after the decimal yiibai |
real | 4 bytes | variable-precision,inexact | 6 decimal digits precision |
double precision | 8 bytes | variable-precision,inexact | 15 decimal digits precision |
smallserial | 2 bytes | small autoincrementing integer | 1 to 32767 |
serial | 4 bytes | autoincrementing integer | 1 to 2147483647 |
bigserial | 8 bytes | large autoincrementing integer | 1 to 9223372036854775807 |
貨幣類型
貨幣類型存儲的貨幣金額與一個固定的分數精度。可以轉換為金錢的數字,int和bigint數據類型的值。不推薦使用浮點數來處理金錢的潛力,由於舍入誤差。
Name | Storage Size | Description | Range |
---|---|---|---|
money | 8 bytes | currency amount | -92233720368547758.08 to +92233720368547758.07 |
字符類型
下表列出了可在PostgreSQL通用字符類型。
名稱 | 描述 |
---|---|
character varying(n), varchar(n) | variable-length with limit |
character(n), char(n) | fixed-length, blank padded |
text | variable unlimited length |
二進製數據類型
bytea數據類型允許存儲二進製字符串,如下麵的表格中說明。
Name | Storage Size | Description |
---|---|---|
bytea | 1 or 4 bytes plus the actual binary string | variable-length binary string |
日期/時間類型
PostgreSQL支持全套的SQL日期和時間類型,列於下表。根據公曆日期計算。在這裡,所有的類型有日期類型以外,其分辨率為day1微秒/14位的解析度。
Name | Storage Size | Description | Low Value | High Value |
---|---|---|---|---|
timestamp [(p)] [without time zone ] | 8 bytes | both date and time (no time zone) | 4713 BC | 294276 AD |
timestamp [(p) ] with time zone | 8 bytes | both date and time, with time zone | 4713 BC | 294276 AD |
date | 4 bytes | date (no time of day) | 4713 BC | 5874897 AD |
time [ (p)] [ without time zone ] | 8 bytes | time of day (no date) | 00:00:00 | 24:00:00 |
time [ (p)] with time zone | 12 bytes | times of day only, with time zone | 00:00:00+1459 | 24:00:00-1459 |
interval [fields ] [(p) ] | 12 bytes | time interval | -178000000 years | 178000000 years |
布爾類型
PostgreSQL提供了標準的SQL類型布爾值。布爾類型可以有幾種狀態:true,false,和第三狀態null,這是SQL空值表示。
Name | Storage Size | Description |
---|---|---|
boolean | 1 byte | state of true or false |
枚舉類型
枚舉(枚舉)類型的數據類型,包括靜態,有序設置的值。在許多編程語言支持枚舉類型,它們是相等。
Unlike other types, Enumerated Types need to be created using CREATE TYPE command. This type is used to store a static, ordered set of values, for example compass directions, i.e. NORTH, SOUTH, EAST, and WEST or days of the week as below:
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
枚舉一旦產生,它們可以像任何其他類型。
幾何類型
幾何數據類型表示二維空間對象。最根本的不同點是形成的所有其他類型的基礎。
Name | Storage Size | Representation | Description |
---|---|---|---|
yiibai | 16 bytes | Yiibai on a plane | (x,y) |
line | 32 bytes | Infinite line (not fully implemented) | ((x1,y1),(x2,y2)) |
lseg | 32 bytes | Finite line segment | ((x1,y1),(x2,y2)) |
box | 32 bytes | Rectangular box | ((x1,y1),(x2,y2)) |
path | 16+16n bytes | Closed path (similar to polygon) | ((x1,y1),...) |
path | 16+16n bytes | Open path | [(x1,y1),...] |
polygon | 40+16n | Polygon (similar to closed path) | ((x1,y1),...) |
circle | 24 bytes | Circle | <(x,y),r> (center yiibai and radius) |
網絡地址類型
PostgreSQL提供的數據類型來存儲的IPv4,IPv6的地址和MAC地址。這是更好地使用這些類型,而不是純文本類型存儲網絡地址,因為這些類型提供輸入錯誤檢查和特殊的操作和函數。
Name | Storage Size | Description |
---|---|---|
cidr | 7 or 19 bytes | IPv4 and IPv6 networks |
inet | 7 or 19 bytes | IPv4 and IPv6 hosts and networks |
macaddr | 6 bytes | MAC addresses |
位串類型
位串類型用於存儲位掩碼。他們要麼是0或1。 SQL位類型有兩種:(n)的位而變位(n)的,其中n是一個正整數
文本搜索類型
這個類型支持全文檢索,這是通過自然語言文檔的集合的搜索,找到那些最符合查詢活動。這有兩種數據類型:
名稱 | 描述 |
---|---|
tsvector | This is a sorted list of distinct words that have been normalized to merge different variants of the same word, called as "lexemes". |
tsquery | This stores lexemes that are to be searched for, and combines them honoring the Boolean operators & (AND), | (OR), and ! (NOT). Parentheses can be used to enforce grouping of the operators. |
UUID類型
一個UUID(通用唯一標識符)寫成小寫的十六進製數字序列,由連字號,特彆是一組8位數字,然後由三組4位數字,然後由一組12位數字分開幾組,總32位,128位代表。
一個UUID的例子是: 550e8400-e29b-41d4-a716-446655440000
XML Type
xml數據類型可以用來存儲XML數據。對於存儲XML數據,首先創建XML值函數XMLPARSE如下:
XMLPARSE (DOCUMENT '<?xml version="1.0"?> <tutorial> <title>PostgreSQL Tutorial </title> <topics>...</topics> </tutorial>') XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
JSON類型
JSON數據類型可以用來存儲JSON(JavaScript對象符號)數據。這樣的數據也可以被存儲為文本,但json數據類型具有的優點是檢查每個存儲的值是否為有效的JSON值。也有相關的支持功能可以直接用來處理JSON數據類型,如下所示:
Example | Example Result |
---|---|
array_to_json('{{1,5},{99,100}}'::int[]) | [[1,5],[99,100]] |
row_to_json(row(1,'foo')) | {"f1":1,"f2":"foo"} |
陣列/數組類型
PostgreSQL的機會定義為可變長度的多維數組的列一個表。任何內置或用戶定義的基本類型數組,枚舉類型,或者可以創建複合型。
DECLARATION OF ARRAYS
數組類型可以聲明為:
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer[], scheme text[][] );
或通過使用關鍵字“ARRAY”:
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer ARRAY[4], scheme text[][] );
插入值
數組的值可以插入一個文本常量,內附大括號內的元素值,並用逗號將它們隔開。例子如下:
INSERT INTO monthly_savings VALUES ('Manisha', '{20000, 14600, 23500, 13250}', '{{"FD", "MF"}, {"FD", "Property"}}');
訪問數組
用於訪問陣列的一個例子如下所示。下麵的命令將選擇人員,他們存儲在第二,第四個。
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
修改數組
修改數組的一個例子如下所示。
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}' WHERE name = 'Manisha';
或數組表達式語法:
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000] WHERE name = 'Manisha';
尋找ARRAYS
搜索數組的一個例子如下所示。
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR saving_per_quarter[2] = 10000 OR saving_per_quarter[3] = 10000 OR saving_per_quarter[4] = 10000;
如果數組的大小是已知的上述搜索方法都可以使用。否則,下麵的例子說明如何時要搜索的大小是不知道的。
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
複合類型
此類型代表一個字段名和數據類型,即結構的一個表中的行或記錄列表。
複合類型聲明
下麵的例子演示如何聲明一個複合類型:
CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric );
此數據類型可用於在創建表如下所示:
CREATE TABLE on_hand ( item inventory_item, count integer );
複合值輸入
複合值可以插入文字常量,封裝領域括號內的值,並用逗號將它們隔開。一個例子是如下:
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
此有效的定義同上的inventory_item的。行關鍵字實際上是可選的表達式中,隻要有一個以上的字段。
訪問複合類型
要訪問一個複合列的字段,字段名,使用點很像選擇字段從一個表名。例如,要選擇一些子字段,on_hand示例表的查詢將如下所示:
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
甚至可以使用表名(例如,在一個多表查詢),像這樣:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
範圍類型
範圍類型的數據類型,采用了一係列數據。範圍類型可以是離散的範圍(例如,所有的整數值1到10)或連續範圍(例如任何時間點的上午10:00到上午11:00)。
內置的範圍類型範圍包括:
-
int4range - Range of integer
-
int8range - Range of bigint
-
numrange - Range of numeric
-
tsrange - Range of timestamp without time zone
-
tstzrange - Range of timestamp with time zone
-
daterange - Range of date
可以創建自定義的範圍類型,做出新的類型的適用範圍,如使用int類型為基礎的IP地址範圍,或者使用浮點數據類型為基礎的浮動範圍。
範圍類型支持包容性和排他性的範圍邊界分彆使用[]和()個字符,例如: [4,9]'代表所有從包括4但不包括9的整數。
對象標識符類型
對象標識符(OID)內部使用PostgreSQL作為各種係統表的主鍵。 OIDS IfWITH指定或default_with_oids配置變量,隻有在這樣的情況下啟用的OID被添加到用戶創建的表。下表列出了幾個彆名類型。 OID彆名類型有冇有自己的操作,除了專門的輸入和輸出過程。
Name | References | Description | Value Example |
---|---|---|---|
oid | any | numeric object identifier | 564182 |
regproc | pg_proc | function name | sum |
regprocedure | pg_proc | function with argument types | sum(int4) |
regoper | pg_operator | operator name | + |
regoperator | pg_operator | operator with argument types | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | relation name | pg_type |
regtype | pg_type | data type name | integer |
regconfig | pg_ts_config | text search configuration | english |
regdictionary | pg_ts_dict | text search dictionary | simple |
偽類型
PostgreSQL類型係統包含了一些特殊用途的統稱為偽類型的項。一個偽類型不能被用作列的數據類型,但它可以用來聲明一個函數的參數或結果類型。下表列出了現有的偽類型。
名稱 | 描述 |
---|---|
any | Indicates that a function accepts any input data type. |
anyelement | Indicates that a function accepts any data type. |
anyarray | Indicates that a function accepts any array data type. |
anynonarray | Indicates that a function accepts any non-array data type. |
anyenum | Indicates that a function accepts any enum data type. |
anyrange | Indicates that a function accepts any range data type. |
cstring | Indicates that a function accepts or returns a null-terminated C string. |
internal | Indicates that a function accepts or returns a server-internal data type. |
language_handler | A procedural language call handler is declared to return language_handler. |
fdw_handler | A foreign-data wrapper handler is declared to return fdw_handler. |
record | Identifies a function returning an unspecified row type. |
trigger | A trigger function is declared to return trigger. |
void | Indicates that a function returns no value. |