2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

10.4. 值儲存 #

插入表的值將根據以下步驟轉換為目標列的資料型別。

值儲存型別轉換

  1. 檢查與目標的精確匹配。

  2. 否則,嘗試將表示式轉換為目標型別。如果兩個型別之間存在已在 pg_cast 目錄中註冊的賦值轉換(請參閱 CREATE CAST),則這是可能的。或者,如果表示式是未知型別字面量,則字面量字串的內容將被饋送到目標型別的輸入轉換例程。

  3. 檢查目標型別是否存在大小轉換。大小轉換是指從該型別到自身的轉換。如果在 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 資料型別的內部名稱),以匹配目標列型別。(由於從 textbpchar 的轉換是二進位制可強制轉換的,因此此轉換不會插入任何實際的函式呼叫。)最後,在系統目錄中找到大小轉換函式 bpchar(bpchar, integer, boolean),並將其應用於運算子的結果和儲存的列長度。此特定於型別的函式執行所需的大小檢查和空格填充。


提交更正

如果您在文件中看到任何不正確、與您使用該特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。