?
本文檔使用 php中文網手冊 發(fā)布
xml數據類型可以用于存儲XML數據。相比較將XML數據存到text類型中,xml數據類型的優(yōu)勢在于 它能夠為XML的編排良好性來檢查輸入值,并且還支持函數對其進行類型安全性檢查,可參閱Section 9.14。 要使用這個數據類型,編譯時必須使用configure --with-libxml。
xml可以存儲由XML標準定義的格式良好的"文檔",以及由XML標準中的XMLDecl? content定義的"內容"片段, 大致上,這意味著內容片段可以有多個頂級元素或字符節(jié)點。xmlvalue IS DOCUMENT表達式可以用來 判斷一個特定的XML值是一個完整的文件還是內容片段。
使用函數xmlparse
:來從字符數據產生xml類型的值:
XMLPARSE ( { DOCUMENT | CONTENT } value)
Examples:
XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>') XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
然而根據SQL標準,這是唯一的用于將字串轉換成XML值得方式,PostgreSQL特有的語法是:
xml '<foo>bar</foo>' '<foo>bar</foo>'::xml
can also be used.
xml類型對一個文檔類型聲明(DTD)不會驗證輸入值,即使輸入值聲明了一個DTD。 目前沒有內置支持用于對其他XML架構語言(如XML Schema)驗證。
使用函數xmlserialize
:來從xml產生一個字串。
XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )
type可以是character,character varying或text (或其中某個的變種)。 同時,根據SQL標準,這是xml和字符類型之間的唯一的轉換方式,但PostgreSQL仍支持簡單的值轉換。
當一個字符串值在沒有通過XMLPARSE或XMLSERIALIZE的情況下,與xml類型進行轉換時,分別的, 選擇DOCUMENT與CONTENT是由"XML option"決定。 會話配置參數,可以由標準命令來設置:
SET XML OPTION { DOCUMENT | CONTENT };
或更多類似的PostgreSQL語法:
SET xmloption TO { DOCUMENT | CONTENT };
默認是CONTENT,因此所有的XML數據格式都能支持。
Note: 隨著默認XML選項的設置,如果字符串中包含一個文檔類型聲明,那么你不能直接將其轉換成xml類型, 因為XML內容片斷的定義不支持。如果非得需要這么做,要么使用XMLPARSE,要么更改XML選項。
在對客戶端和服務器端進行多字符編碼,以及在通過它們傳遞XML數據時需要格外注意。 當使用文本模式(正常模式)在服務器端和客戶端之間傳遞查詢和查詢結果時,PostgreSQL在各自終端對所有傳遞的字符數據和字符編碼進行相互轉換,參閱Section 22.2。 這包括XML值得字符串表示形式,如上面的例子。這通常意味著XML數據中的編碼聲明,在客戶端和服務器之間傳遞時,可以成為無效字符數據轉換為其他編碼。 這是因為枚舉編碼聲明沒有改變。為了應對該問題,提交輸入到xml類型的字符串中的編碼聲明會被ignored, 同時,內容會被認為是在當前服務器編碼中。所以,對正確的處理來說,XML數據的字符串必須從在當前客戶端編碼中的客戶端發(fā)送。 客戶端有責任,要么將文檔轉換成當前客戶端編碼,在傳遞到服務器之前,要么適當的調整客戶端編碼。 輸出時,xml類型的值不會有編碼聲明,同時客戶端會認為所有的數據都是在當前客戶端編碼之中的。
當使用二進制模式在服務器和客戶端之間傳遞查詢參數和查詢結果,沒有執(zhí)行字符集轉換, 因此解決方法是不同的。在這種情況下,將會遵守XML數據中的編碼聲明,并且如果不存在, 數據會被假定為UTF-8格式(如同XML標準要求那樣,但需要注意的是PostgreSQL不支持UTF-16). 輸出時,會對數據進行編碼聲明以聲明客戶端編碼,除非客戶端編碼格式是UTF-8。
不用說,如果XML數據編碼格式,客戶端編碼格式,以及服務器編碼格式都一樣,那么用PostgreSQL處理XML數據將會減少錯誤,并且效率會很高。 在國內,XML數據是用UTF-8編碼格式處理的,因此,如果服務器端編碼也是UTF-8時,計算性能會很高。
Caution |
當服務器編碼非UTF-8格式時,一些相關的XML函數可能完全不支持非ASCII數據,特別是 |
xml數據類型有些特殊,因為它不提供比較運算符。 這是因為對XML數據,沒有很好的定義和通用的比較運算符。 這樣做的一個后果是,不能通過xml與檢索值的比較來檢索行。 因此XML值必須帶有一個單獨的關鍵值,如一個ID。 另一個解決比較XML值得方法是,先將它們轉換成字符串,但需要注意的是字符串比較與一個有用的XML比較方法無關。
因為沒有針對xml數據類型的比較運算符,因此不能在這種類型的字段上直接創(chuàng)建索引。 如果需要對XML數據進行快速搜索,可能得解決方法包括將表達式轉換成一個字符串類型,然后對它進行索引,或索引一個XPath表達式。 當然,實際查詢是將不得不進行調整,以使用一個索引表達式進行檢索。
PostgreSQL中的文本檢索功能也可用于加快XML數據的全文搜索。但必要的預處理支持在PostgreSQL中還不能獲得。 然后