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