本篇內容介紹了“PostgreSQL的數據類型轉換規則是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、網站制作、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的杭錦后網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
插入到數據表的值按如下步驟轉換為目標列數據類型.
Value Storage Type Conversion
1.檢查是否與目標完全匹配
2.如不能完全匹配,則轉換表達式為目標類型.如果在pg_cast系統目錄中存在兩種類型的轉換信息,那么這是可以做到的.否則,如果表達式為unknown類型,literal string的內容會反饋給輸入轉換例程,用于轉換為目標類型.
3.檢查目標類型是否有sizing轉換.sizing cast是從該類型到自身的一種轉換.如在pg_cast找到相應的cast,在存儲到目標列前在該表達式上應用該轉換.實現函數通常需要一個額外類為integer的參數,用于接收目標列的atttypmod屬性值(該值通常用于表示長度),同時需要第3個類型為boolean的參數用于確定cast是顯式還是隱式轉換.轉換函數有責任執行所有與長度相關的語義如大小檢查或截斷.
下面是一些例子:
character 字符類型轉換
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)
‘abc’和’def’這兩者類型被視為unknown,轉換為text類型執行連接操作,||操作的結果為text,該結果轉換為bpchar(blank-padded char,character的內部名稱)用以匹配目標列類型.
查看pg_cast系統目錄
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)
轉換函數
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)必須匹配可能的不太相同的類型以成形成一個單獨的結果集.該解析算法分別應用于union查詢的每一個輸出列.CASE, ARRAY, VALUES, GREATEST 和 LEAST使用相同的算法匹配表達式并選擇結果數據類型.
Type Resolution for UNION, CASE, and Related Constructs
1.如果所有輸入是同一種類型,而且不是unknown,則解析為該類型
2.如果所有輸入為同一個domain類型,則后續步驟的處理的時候把類型視為domain的基類型
3.如果所有輸入類型為unknown,則解析為text(字符串的首選類型).否則,unknown類型的輸入接下來會被忽略
4.如果非unknown類型不是同一個類型,則失敗
5.選擇第一個非unknown類型的首選類型
6.否則,選擇允許所有優先非unknown輸入可被隱私轉換的最后一個非unknown輸入類型
7.轉換所有輸入為選擇的類型,如存在不能轉換的類型,則失敗
下面是一些例子:
Simple Union
testdb=# SELECT 1.2 AS "numeric" UNION SELECT 1; numeric --------- 1 1.2 (2 rows)
1.2明確為numeric類型,integer 1可隱式轉換為numeric,因此使用numeric類型
Transposed Union
testdb=# SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL); real ------ 1 2.2 (2 rows)
實數不能隱式轉換為整數,但整數可隱式轉換為real,因此1會被轉換為real,union結果類型為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”.按照上面的規則,內部union會解析為text類型,外部union的輸入為text和integer類型,導致上述錯誤.
“PostgreSQL的數據類型轉換規則是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
網站題目:PostgreSQL的數據類型轉換規則是什么
轉載來于:http://m.kartarina.com/article2/jeddic.html
成都網站建設公司_創新互聯,為您提供網站維護、網頁設計公司、做網站、網站制作、網站設計、網站導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯