您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
插入到數(shù)據(jù)表的值按如下步驟轉(zhuǎn)換為目標(biāo)列數(shù)據(jù)類型.
Value Storage Type Conversion
1.檢查是否與目標(biāo)完全匹配
2.如不能完全匹配,則轉(zhuǎn)換表達(dá)式為目標(biāo)類型.如果在pg_cast系統(tǒng)目錄中存在兩種類型的轉(zhuǎn)換信息,那么這是可以做到的.否則,如果表達(dá)式為unknown類型,literal string的內(nèi)容會(huì)反饋給輸入轉(zhuǎn)換例程,用于轉(zhuǎn)換為目標(biāo)類型.
3.檢查目標(biāo)類型是否有sizing轉(zhuǎn)換.sizing cast是從該類型到自身的一種轉(zhuǎn)換.如在pg_cast找到相應(yīng)的cast,在存儲(chǔ)到目標(biāo)列前在該表達(dá)式上應(yīng)用該轉(zhuǎn)換.實(shí)現(xiàn)函數(shù)通常需要一個(gè)額外類為integer的參數(shù),用于接收目標(biāo)列的atttypmod屬性值(該值通常用于表示長(zhǎng)度),同時(shí)需要第3個(gè)類型為boolean的參數(shù)用于確定cast是顯式還是隱式轉(zhuǎn)換.轉(zhuǎn)換函數(shù)有責(zé)任執(zhí)行所有與長(zhǎng)度相關(guān)的語(yǔ)義如大小檢查或截?cái)?
下面是一些例子:
character 字符類型轉(zhuǎn)換
testdb=# CREATE TABLE vv (v character(20)); CREATE TABLE testdb=# INSERT INTO vv SELECT 'abc' || 'def'; INSERT 0 1 testdb=# SELECT v, octet_length(v) FROM vv; v | octet_length ----------------------+-------------- abcdef | 20 (1 row)
‘a(chǎn)bc’和’def’這兩者類型被視為unknown,轉(zhuǎn)換為text類型執(zhí)行連接操作,||操作的結(jié)果為text,該結(jié)果轉(zhuǎn)換為bpchar(blank-padded char,character的內(nèi)部名稱)用以匹配目標(biāo)列類型.
查看pg_cast系統(tǒng)目錄
testdb=# select oid,typname from pg_type where typname in ('text','bpchar','char'); oid | typname ------+--------- 18 | char 25 | text 1042 | bpchar (3 rows) testdb=# select * from pg_cast where castsource=25; oid | castsource | casttarget | castfunc | castcontext | castmethod -------+------------+------------+----------+-------------+------------ 11381 | 25 | 2205 | 1079 | i | f 11397 | 25 | 1042 | 0 | i | b 11398 | 25 | 1043 | 0 | i | b 11409 | 25 | 18 | 944 | a | f 11412 | 25 | 19 | 407 | i | f 11466 | 25 | 142 | 2896 | e | f (6 rows)
轉(zhuǎn)換函數(shù)
testdb=# select oid,proname,prorettype,proargtypes,prosrc from pg_proc where oid in (0,407,944,1079,2896); oid | proname | prorettype | proargtypes | prosrc ------+----------+------------+-------------+--------------- 407 | name | 19 | 25 | text_name 944 | char | 18 | 25 | text_char 1079 | regclass | 2205 | 25 | text_regclass 2896 | xml | 142 | 25 | texttoxml (4 rows)
UNION(INTERSECT/EXCEPT)必須匹配可能的不太相同的類型以成形成一個(gè)單獨(dú)的結(jié)果集.該解析算法分別應(yīng)用于union查詢的每一個(gè)輸出列.CASE, ARRAY, VALUES, GREATEST 和 LEAST使用相同的算法匹配表達(dá)式并選擇結(jié)果數(shù)據(jù)類型.
Type Resolution for UNION, CASE, and Related Constructs
1.如果所有輸入是同一種類型,而且不是unknown,則解析為該類型
2.如果所有輸入為同一個(gè)domain類型,則后續(xù)步驟的處理的時(shí)候把類型視為domain的基類型
3.如果所有輸入類型為unknown,則解析為text(字符串的首選類型).否則,unknown類型的輸入接下來(lái)會(huì)被忽略
4.如果非unknown類型不是同一個(gè)類型,則失敗
5.選擇第一個(gè)非unknown類型的首選類型
6.否則,選擇允許所有優(yōu)先非unknown輸入可被隱私轉(zhuǎn)換的最后一個(gè)非unknown輸入類型
7.轉(zhuǎn)換所有輸入為選擇的類型,如存在不能轉(zhuǎn)換的類型,則失敗
下面是一些例子:
Simple Union
testdb=# SELECT 1.2 AS "numeric" UNION SELECT 1; numeric --------- 1 1.2 (2 rows)
1.2明確為numeric類型,integer 1可隱式轉(zhuǎn)換為numeric,因此使用numeric類型
Transposed Union
testdb=# SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL); real ------ 1 2.2 (2 rows)
實(shí)數(shù)不能隱式轉(zhuǎn)換為整數(shù),但整數(shù)可隱式轉(zhuǎn)換為real,因此1會(huì)被轉(zhuǎn)換為real,union結(jié)果類型為real.
Nested Union
testdb=# SELECT NULL UNION SELECT NULL UNION SELECT 1; psql: ERROR: UNION types text and integer cannot be matched LINE 1: SELECT NULL UNION SELECT NULL UNION SELECT 1;
PG會(huì)把多個(gè)Unions視為成對(duì)的操作,該SQL可被視為”(SELECT NULL UNION SELECT NULL) UNION SELECT 1”.按照上面的規(guī)則,內(nèi)部union會(huì)解析為text類型,外部union的輸入為text和integer類型,導(dǎo)致上述錯(cuò)誤.
“PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。