10.4. 值儲存

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

值儲存資料類型解析

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

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

  3. 檢查一下看看目標類型是否有測長轉換。 測長轉換是一個從某類型到自身的轉換。如果在 pg_cast 資料表裡面找到這麼一個, 那麼在儲存到目標字串之前先在資料表達式上應用。這樣的轉換的實現函數總是接受一個額外的類型為 integer 的參數,它接收目標字串的聲明成都(實際上是其 atttypmod 值; atttypmod 的解釋印不同的資料類型而不同)。 轉換函數負責施加那些長度相關的語義,比如長度檢查或者階段。

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) 並且應用於該操作符的結果並儲存字串長。這個類型相關的函數執行所需要的長度檢查和額外的空白填充。