?
This document uses PHP Chinese website manual Release
SQL是強類型語言。也就是說,每個數(shù)據(jù)都與一個決定其行為和用法的數(shù)據(jù)類型相關(guān)聯(lián)。 PostgreSQL有一個可擴展的數(shù)據(jù)類型系統(tǒng),該系統(tǒng)比其它SQL實現(xiàn)更具通用性和靈活性。因而,PostgreSQL中 大多數(shù)類型轉(zhuǎn)換是由通用規(guī)則來管理的,而不是由專門的試探法分析的, 這種做法使得混合類型表達式變得有意義,即便是其中包含用戶定義的類型也如此。
PostgreSQL掃描/分析器只將詞法元素分解成五個基本種類:整數(shù)、浮點數(shù)、字符串、名字、關(guān)鍵字。 大多數(shù)非數(shù)字類型首先表征為字符串,SQL語言的定義允許將類型名聲明為字符串, 這個機制被PostgreSQL用于保證分析器沿著正確的方向運行。 例如,下面查詢:
SELECT text 'Origin' AS "label", point '(0,0)' AS "value"; label | value --------+------- Origin | (0,0) (1 row)
有兩個文本常量,類型分別為text和point。如果沒有為字符串文本聲明類型,該文本先被 初始化成一個擁有存儲空間的unknown類型,該類型將在后面描述的晚期階段分析
在PostgreSQL分析器里,有四種基本的SQL元素需要 獨立的類型轉(zhuǎn)換規(guī)則:
多數(shù)PostgreSQL類型系統(tǒng)是建筑在一套豐富的函數(shù)上的。 函數(shù)調(diào)用可以有一個或多個參數(shù)。因為PostgreSQL允許函數(shù)重載, 所以函數(shù)名自身并不唯一地標識將要調(diào)用的函數(shù),分析器必須根據(jù)函數(shù)提供的參數(shù)類型選擇正確的函數(shù)。
PostgreSQL允許在表達式上使用前綴或后綴(單目)操作符,也允許表達式內(nèi) 部使用雙目操作符(兩個參數(shù))。像函數(shù)一樣,操作符也可以被重載,因此操作符的選擇也和函數(shù)一樣取決于 參數(shù)類型。
SQLINSERT和UPDATE語句將表達式結(jié)果放 入表中。語句中的表達式類型必須和目標字段的類型一致或者可以轉(zhuǎn)換為一致。
因為聯(lián)合SELECT語句中的所有查詢結(jié)果必須在一列里顯示出來,所以每個
SELECT子句中的元素類型必須相互匹配并轉(zhuǎn)換成一套統(tǒng)一類型。類似地,一個
CASE構(gòu)造的結(jié)果表達式必須轉(zhuǎn)換成統(tǒng)一的類型,這樣CASE表達式自身作為整體
有一種已知輸出類型。同樣的要求也存在于ARRAY構(gòu)造以及GREATEST
和
LEAST
函數(shù)中。
系統(tǒng)表casts存儲有關(guān)哪種數(shù)據(jù)類型之間的轉(zhuǎn)換是合法的以及如何執(zhí)行這些轉(zhuǎn)換的 信息。額外的轉(zhuǎn)換可以由用戶通過 CREATE CAST 命令增加。這個通常和定義一種新的數(shù)據(jù)類型一起完成。 內(nèi)置的類型轉(zhuǎn)換集已經(jīng)經(jīng)過仔細的雕琢了,因此最好不要去更改它們。
額外的,解析器允許改進檢查帶有隱式轉(zhuǎn)換的組中的恰當?shù)霓D(zhuǎn)換。 數(shù)據(jù)類型被分為幾個基本的type categories,包括 boolean,numeric,string, bitstring,datetime,timespan, geometric,network和用戶自定義類型。 (可參閱Table 45-45獲得一個列表;但需要注意的是 也可能創(chuàng)建自定義類型類別)在每個類別中,可以有一個或多個preferred types, 當存在可能得類型選擇時,這個是最好的選擇。在有了仔細選擇的首選類型和可獲得的隱式轉(zhuǎn)換, 那么可以確定的是模糊的表達式(那些帶有多個候選解析方案的表達式)可以用一種有效的 方式來處理。
所有類型轉(zhuǎn)換規(guī)則都是建立在下面幾個基本原則上的:
隱含轉(zhuǎn)換決不能有奇怪的或不可預見的輸出。
如果一個查詢不需要隱含的類型轉(zhuǎn)換,分析器或執(zhí)行器不應該進行更多的額外操作。這就是說,任何一個類型匹 配、格式清晰的查詢不應該在分析器里耗費更多的時間,也不應該向查詢中引入任何不必要的隱含類型轉(zhuǎn)換調(diào)用。
另外,如果一個查詢通常使用某個函數(shù)進行隱含類型轉(zhuǎn)換,而用戶定義了一個有正確參數(shù)的函數(shù), 解釋器應該使用新函數(shù)取代原先舊函數(shù)的隱含操作。