10.4. 值存儲

要插入表中的數值也根據下面的步驟轉換成目標列的數據類型。

值存儲數據類型解析

  1. 查找與目標列準確的匹配。

  2. 否則,試著將表達式直接轉換成目標類型。 如果已知該兩種類型之間存在一個已注冊的轉換函數, 那麼這樣做就是可以的。如果表達式是一個未知類型文本, 該文本字串的內容將交給目標類型的輸入轉換過程。

  3. 如果目標是定長類型(如 char 或聲明了長度的 varchar) 則試著為目標類型找一個測長函數。 測長函數是一個與類型同名的函數,有兩個參數, 第一個參數類型為該類型,第二個參數是integer,並且返回同種類型。 如果找到一個,用之,把該字段聲明的長度做為第二個參數傳遞。

Example 10-6. character 存儲類型轉換

對一個目標列定義為 character(20) 的語句, 下面語句確保存儲值的正確定長:

CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, length(v) FROM vv;

          v           | length
----------------------+--------
 abcdef               |     20
(1 row)

這裡真正發生的事情是兩個 unknown 文本解析缺省成text, 這樣就允許 || 操作符解析成text連接。 然後操作符的text結果轉換成bpchar"空白填充的字符型"character類型內部名稱)以匹配目標字段類型。 (不過,因為知道textbpchar是二進制兼容的,這樣的轉換是隱含的並且實際上不做任何函數調用。) 最後,在系統表裡找到測長函數 bpchar(bpchar,integer) 並且應用于該操作符的結果並存儲字段長。這個類型相關的函數執行所需要的長度檢查和額外的空白填充。