本篇內(nèi)容介紹了“PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的杭錦后網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
插入到數(shù)據(jù)表的值按如下步驟轉(zhuǎn)換為目標列數(shù)據(jù)類型.
Value Storage Type Conversion
1.檢查是否與目標完全匹配
2.如不能完全匹配,則轉(zhuǎn)換表達式為目標類型.如果在pg_cast系統(tǒng)目錄中存在兩種類型的轉(zhuǎn)換信息,那么這是可以做到的.否則,如果表達式為unknown類型,literal string的內(nèi)容會反饋給輸入轉(zhuǎn)換例程,用于轉(zhuǎn)換為目標類型.
3.檢查目標類型是否有sizing轉(zhuǎn)換.sizing cast是從該類型到自身的一種轉(zhuǎn)換.如在pg_cast找到相應(yīng)的cast,在存儲到目標列前在該表達式上應(yīng)用該轉(zhuǎn)換.實現(xiàn)函數(shù)通常需要一個額外類為integer的參數(shù),用于接收目標列的atttypmod屬性值(該值通常用于表示長度),同時需要第3個類型為boolean的參數(shù)用于確定cast是顯式還是隱式轉(zhuǎn)換.轉(zhuǎn)換函數(shù)有責(zé)任執(zhí)行所有與長度相關(guān)的語義如大小檢查或截斷.
下面是一些例子:
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)部名稱)用以匹配目標列類型.
查看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)必須匹配可能的不太相同的類型以成形成一個單獨的結(jié)果集.該解析算法分別應(yīng)用于union查詢的每一個輸出列.CASE, ARRAY, VALUES, GREATEST 和 LEAST使用相同的算法匹配表達式并選擇結(jié)果數(shù)據(jù)類型.
Type Resolution for UNION, CASE, and Related Constructs
1.如果所有輸入是同一種類型,而且不是unknown,則解析為該類型
2.如果所有輸入為同一個domain類型,則后續(xù)步驟的處理的時候把類型視為domain的基類型
3.如果所有輸入類型為unknown,則解析為text(字符串的首選類型).否則,unknown類型的輸入接下來會被忽略
4.如果非unknown類型不是同一個類型,則失敗
5.選擇第一個非unknown類型的首選類型
6.否則,選擇允許所有優(yōu)先非unknown輸入可被隱私轉(zhuǎn)換的最后一個非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ù)不能隱式轉(zhuǎn)換為整數(shù),但整數(shù)可隱式轉(zhuǎn)換為real,因此1會被轉(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會把多個Unions視為成對的操作,該SQL可被視為”(SELECT NULL UNION SELECT NULL) UNION SELECT 1”.按照上面的規(guī)則,內(nèi)部union會解析為text類型,外部union的輸入為text和integer類型,導(dǎo)致上述錯誤.
“PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!