溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么

發(fā)布時(shí)間:2021-11-09 11:26:59 來(lái)源:億速云 閱讀:228 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫(kù)

本篇內(nèi)容介紹了“PostgreSQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、Value Storage

插入到數(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í)用文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI