插入表的值將根據以下步驟轉換為目標列的資料型別。
值儲存型別轉換
檢查與目標的精確匹配。
否則,嘗試將表示式轉換為目標型別。如果兩個型別之間存在已在 pg_cast
目錄中註冊的賦值轉換(請參閱 CREATE CAST),則這是可能的。或者,如果表示式是未知型別字面量,則字面量字串的內容將被饋送到目標型別的輸入轉換例程。
檢查目標型別是否存在大小轉換。大小轉換是指從該型別到自身的轉換。如果在 pg_cast
目錄中找到一個,則在儲存到目標列之前將其應用於表示式。此類轉換的實現函式始終接受一個額外的 integer
型別引數,該引數接收目標列的 atttypmod
值(通常是其宣告的長度,儘管 atttypmod
的解釋因資料型別而異),並且可能接受一個第三個 boolean
引數,該引數指示轉換是顯式的還是隱式的。轉換函式負責應用任何依賴於長度的語義,例如大小檢查或截斷。
示例 10.9. character
儲存型別轉換
對於宣告為 character(20)
的目標列,以下語句顯示儲存的值大小正確。
CREATE TABLE vv (v character(20)); INSERT INTO vv SELECT 'abc' || 'def'; SELECT v, octet_length(v) FROM vv; v | octet_length ----------------------+-------------- abcdef | 20 (1 row)
這裡實際發生的是,兩個未知字面量預設解析為 text
,允許 ||
運算子解析為 text
連線。然後,運算子的 text
結果被轉換為 bpchar
(“空格填充字元”,character
資料型別的內部名稱),以匹配目標列型別。(由於從 text
到 bpchar
的轉換是二進位制可強制轉換的,因此此轉換不會插入任何實際的函式呼叫。)最後,在系統目錄中找到大小轉換函式 bpchar(bpchar, integer, boolean)
,並將其應用於運算子的結果和儲存的列長度。此特定於型別的函式執行所需的大小檢查和空格填充。
如果您在文件中看到任何不正確、與您使用該特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。