PostgreSQL 值存儲

2021-08-27 11:40 更新

將被插入到一個(gè)表的值會按照下列步驟被轉(zhuǎn)換到目標(biāo)列的數(shù)據(jù)類型。

值存儲類型轉(zhuǎn)換

  1. 檢查一個(gè)與目標(biāo)的準(zhǔn)確匹配。

  2. 否則,嘗試轉(zhuǎn)換表達(dá)式為目標(biāo)類型。如果在兩種類型之間的一個(gè) 賦值造型已經(jīng)被注冊在pg_cast 目錄(見CREATE CAST)中, 這是可能的。或者,如果該表達(dá)式是一個(gè)未知類型的文字, 則該文字串的內(nèi)容將被提供給目標(biāo)類型的輸入轉(zhuǎn)換例程。

  3. 檢查是否有一個(gè)用于目標(biāo)類型的尺寸調(diào)整造型。尺寸調(diào)整造型是一個(gè)從該類型到其自身的造型。 如果在pg_cast目錄中找到一個(gè),那么把表達(dá)式存儲到目標(biāo)列中之前把它應(yīng)用到表達(dá)式。這樣一個(gè)造型的實(shí)現(xiàn)函數(shù)總是采用一個(gè)額外的integer類型的參數(shù),它接收目標(biāo)列的atttypmod值(通常是它被聲明的長度,盡管對于不同數(shù)據(jù)類型 atttypmod有不同的解釋),并且它可能采用第三個(gè)boolean參數(shù)來說明造型是顯式的還是隱式的。該造型函數(shù)負(fù)責(zé)應(yīng)用任何長度相關(guān)的語義,例如尺寸檢查或截?cái)唷?/p>

例 10.9. character存儲類型轉(zhuǎn)換

對于一個(gè)聲明為character(20)的目標(biāo)列,下面的語句展示了被存儲的值如何被正確地調(diào)整尺寸:

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)

實(shí)際發(fā)生的事情是兩個(gè)未知文字被默認(rèn)決定為text,允許||操作符被決定為text連接。 然后操作符的text結(jié)果被轉(zhuǎn)換成bpchar空白填充字符, character數(shù)據(jù)類型的內(nèi)部名稱)來匹配目標(biāo)列類型(由于從textbpchar的轉(zhuǎn)換是二進(jìn)制強(qiáng)制的,這個(gè)轉(zhuǎn)換不會插入任何實(shí)際的函數(shù)調(diào)用)。最后,尺寸調(diào)整函數(shù)bpchar(bpchar, integer, boolean)被從系統(tǒng)目錄中找到并應(yīng)用到操作符的結(jié)果和存儲的列長度上。這個(gè)類型相關(guān)的函數(shù)執(zhí)行必要的長度檢查并增加填充的空間。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號