| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ðлава 8. Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ | След. |
8.13. Тип XML
Тип xml пÑедназнаÑен Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ XML-даннÑÑ . Ðго пÑеимÑÑеÑÑво по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑм Ñипом text в Ñом, ÑÑо он пÑовеÑÑÐµÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñе знаÑÐµÐ½Ð¸Ñ Ð½Ð° допÑÑÑимоÑÑÑ Ð¿Ð¾ пÑавилам XML и Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼ еÑÑÑ ÑипобезопаÑнÑе ÑÑнкÑии; Ñм. Раздел 9.14. ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑого Ñипа диÑÑÑибÑÑив должен бÑÑÑ ÑкомпилиÑован в конÑигÑÑаÑии configure --with-libxml.
Тип xml Ð¼Ð¾Ð¶ÐµÑ ÑÐ¾Ñ ÑанÑÑÑ Ð¿ÑавилÑно оÑоÑмленнÑе "докÑменÑÑ", в ÑооÑвеÑÑÑвии Ñо ÑÑандаÑÑом XML, а Ñакже ÑÑагменÑÑ "ÑодеÑжимого", опиÑаннÑе как ÑодеÑжимое ÑлеменÑов в ÑÑандаÑÑе XML. ÐÑÑгими Ñловами, ÑÑо ознаÑаеÑ, ÑÑо ÑÑагменÑÑ ÑодеÑжимого могÑÑ ÑодеÑжаÑÑ Ð½ÐµÑколÑко ÑлеменÑов веÑÑ Ð½ÐµÐ³Ð¾ ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑекÑÑовÑÑ Ñзлов. ÐпÑеделиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ опÑеделÑнное знаÑение Ñипа xml полнÑм докÑменÑом или ÑÑагменÑом ÑодеÑжимого, позволÑÐµÑ Ð²ÑÑажение xmlvalue IS DOCUMENT.
8.13.1. Создание XML-знаÑений
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð½Ð°Ñение Ñипа xml из ÑекÑÑовой ÑÑÑоки, иÑполÑзÑйÑе ÑÑнкÑÐ¸Ñ xmlparse:
XMLPARSE ( { DOCUMENT | CONTENT } value)ÐÑимеÑÑ:
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
Ñоже допÑÑÑим.
Тип xml не пÑовеÑÑÐµÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑ ÐµÐ¼Ðµ DTD (Document Type Declaration, ÐбÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñипа докÑменÑа), даже еÑли в Ð½Ð¸Ñ Ð¿ÑиÑÑÑÑÑвÑÑÑ ÑÑÑлка на DTD. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² PostgreSQL Ñакже Ð½ÐµÑ Ð²ÑÑÑоенной поддеÑжки дÑÑÐ³Ð¸Ñ ÑазновидноÑÑей ÑÑ ÐµÐ¼, напÑÐ¸Ð¼ÐµÑ XML Schema.
ÐбÑаÑÐ½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ, полÑÑение ÑекÑÑовой ÑÑÑоки из xml, вÑполнÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии xmlserialize:
XMLSERIALIZE ( { DOCUMENT | CONTENT } знаÑение AS Ñип )ÐдеÑÑ Ð´Ð¾Ð¿ÑÑÑимÑй Ñип — character, character varying или text (или Ð¸Ñ Ð¿ÑевдонимÑ). Рв данном ÑлÑÑае ÑÑандаÑÑ SQL пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ ÑолÑко один ÑпоÑоб пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ xml в Ñип ÑекÑÑовÑÑ ÑÑÑок, но PostgreSQL позволÑÐµÑ Ð¿ÑоÑÑо пÑивеÑÑи знаÑение к нÑÐ¶Ð½Ð¾Ð¼Ñ ÑипÑ.
ÐÑи пÑеобÑазовании ÑекÑÑовой ÑÑÑоки в Ñип xml или наобоÑÐ¾Ñ Ð±ÐµÐ· иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑий XMLPARSE и XMLSERIALIZE, вÑÐ±Ð¾Ñ Ñежима DOCUMENT или CONTENT опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом конÑигÑÑаÑии ÑеанÑа "XML option", ÑÑÑановиÑÑ ÐºÐ¾ÑоÑÑй можно ÑледÑÑÑей ÑÑандаÑÑной командой:
SET XML OPTION { DOCUMENT | CONTENT };или Ñакой командой в дÑÑ Ðµ PostgreSQL:
SET xmloption TO { DOCUMENT | CONTENT };Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение CONTENT, Ñак ÑÑо допÑÑкаÑÑÑÑ Ð²Ñе ÑоÑÐ¼Ñ XML-даннÑÑ .
ÐамеÑание: Ðогда паÑамеÑÑ XML option Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ, ÑекÑÑовÑе ÑÑÑоки нелÑÐ·Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð¿ÑивеÑÑи к ÑÐ¸Ð¿Ñ xml, еÑли они ÑодеÑÐ¶Ð°Ñ Ð¾Ð±ÑÑвление Ñипа докÑменÑа, Ñак как Ñакие обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ допÑÑкаÑÑÑÑ Ð²Ð¾ ÑÑагменÑÐ°Ñ . ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ XMLPARSE или измениÑÑ Ð¿Ð°ÑамеÑÑ XML option.
8.13.2. ÐбÑабоÑка кодиÑовки
ÐÑли на ÑÑоÑоне ÑеÑвеÑа и клиенÑа и в XML-даннÑÑ Ð¸ÑполÑзÑÑÑÑÑ ÑазнÑе кодиÑовки Ñимволов, Ñ ÑÑим могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð¿ÑоблемÑ. Ðогда запÑоÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð½Ð° ÑеÑвеÑ, а Ð¸Ñ ÑезÑлÑÑаÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð² обÑÑном ÑекÑÑовом Ñежиме, PostgreSQL пÑеобÑазÑÐµÑ Ð²Ñе пеÑедаваемÑе ÑекÑÑовÑе даннÑе в кодиÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑей ÑÑоÑонÑ; Ñм. Раздел 22.3. Ð Ñом ÑиÑле ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¸ Ñо ÑÑÑоковÑми пÑедÑÑавлениÑми XML-даннÑÑ , подобнÑми Ñем, ÑÑо Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² пÑедÑдÑÑÐ¸Ñ Ð¿ÑимеÑÐ°Ñ . ÐбÑÑно ÑÑо ознаÑаеÑ, ÑÑо обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, ÑодеÑжаÑиеÑÑ Ð² XML-даннÑÑ , могÑÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑи, когда ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока пÑеобÑазÑеÑÑÑ Ð¸Ð· одной кодиÑовки в дÑÑгÑÑ Ð¿Ñи пеÑедаÑе даннÑÑ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом, Ñак как подобнÑе вклÑÑÑннÑе в даннÑе обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð°Ð²ÑомаÑиÑеÑки. ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, ÑодеÑжаÑиеÑÑ Ð² ÑекÑÑовÑÑ ÑÑÑÐ¾ÐºÐ°Ñ , вводимÑÑ Ð² Ñип xml, пÑоÑÑо игноÑиÑÑÑÑÑÑ Ð¸ пÑедполагаеÑÑÑ, ÑÑо XML-ÑодеÑжимое пÑедÑÑавлено в ÑекÑÑей кодиÑовке ÑеÑвеÑа. Ðак ÑледÑÑвие, Ð´Ð»Ñ Ð¿ÑавилÑной обÑабоÑки ÑÐ°ÐºÐ¸Ñ ÑÑÑок Ñ XML-даннÑми ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаваÑÑ Ð¸Ñ Ð² Ñвоей ÑекÑÑей кодиÑовке. ÐÐ»Ñ ÑеÑвеÑа не важно, бÑÐ´ÐµÑ Ð»Ð¸ ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð»Ñ ÑÑого пÑеобÑазовÑваÑÑ Ð´Ð¾ÐºÑменÑÑ Ð² ÑÐ²Ð¾Ñ ÐºÐ¾Ð´Ð¸ÑовкÑ, или Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ ÐµÑ, пÑежде Ñем пеÑедаваÑÑ ÐµÐ¼Ñ Ð´Ð°Ð½Ð½Ñе. ÐÑи вÑводе знаÑÐµÐ½Ð¸Ñ Ñипа xml не ÑодеÑÐ¶Ð°Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, а ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑедполагаÑÑ, ÑÑо вÑе даннÑе поÑÑÑпаÑÑ Ð² его ÑекÑÑей кодиÑовке.
ÐÑли паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑа пеÑедаÑÑÑÑ Ð½Ð° ÑеÑÐ²ÐµÑ Ð¸ он возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð² двоиÑном Ñежиме, кодиÑовка Ñимволов не пÑеобÑазÑеÑÑÑ, Ñак ÑÑо Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð´ÑÑÐ³Ð°Ñ ÑиÑÑаÑиÑ. Ð ÑÑом ÑлÑÑае обÑÑвление кодиÑовки в XML пÑинимаеÑÑÑ Ð²Ð¾ внимание, а еÑли его неÑ, Ñо пÑедполагаеÑÑÑ, ÑÑо даннÑе закодиÑÐ¾Ð²Ð°Ð½Ñ Ð² UTF-8 (ÑÑо ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ XML; замеÑÑÑе, ÑÑо PostgreSQL не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ UTF-16). ÐÑи вÑводе в даннÑе бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ обÑÑвление кодиÑовки, вÑбÑанной на ÑÑоÑоне клиенÑа (но еÑли ÑÑо UTF-8, обÑÑвление бÑÐ´ÐµÑ Ð¾Ð¿ÑÑено).
Само Ñобой, XML-даннÑе в PostgreSQL бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð³Ð¾Ñаздо ÑÑÑекÑивнее, когда и в XML-даннÑÑ , и на ÑÑоÑоне клиенÑа, и на ÑÑоÑоне ÑеÑвеÑа иÑполÑзÑеÑÑÑ Ð¾Ð´Ð½Ð° кодиÑовка. Так как внÑÑÑи XML-даннÑе пÑедÑÑавлÑÑÑÑÑ Ð² UTF-8, опÑималÑнÑй ваÑианÑ, когда на ÑеÑвеÑе Ñакже вÑбÑана кодиÑовка UTF-8.
| ÐÑедоÑÑеÑежение |
ÐекоÑоÑÑе XML-ÑÑнкÑии могÑÑ Ð²Ð¾Ð²Ñе не ÑабоÑаÑÑ Ñ Ð´Ð°Ð½Ð½Ñми не-ASCII, еÑли кодиÑовка ÑеÑвеÑа — не UTF-8. Ð ÑаÑÑноÑÑи, ÑÑо извеÑÑÐ½Ð°Ñ Ð¾ÑобенноÑÑÑ ÑÑнкÑии |
8.13.3. ÐбÑаÑение к XML-знаÑениÑм
Тип xml оÑлиÑаеÑÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ñем, ÑÑо Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ не опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ опеÑаÑоÑÑ ÑÑавнениÑ, Ñак как ÑÑÑко опÑеделÑнного и ÑнивеÑÑалÑного алгоÑиÑма ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ XML-даннÑÑ Ð½Ðµ ÑÑÑеÑÑвÑеÑ. Ðдно из ÑледÑÑвий ÑÑого — нелÑÐ·Ñ Ð¾ÑÑилÑÑÑоваÑÑ ÑÑÑоки ÑаблиÑÑ, ÑÑавнив ÐºÐ¾Ð»Ð¾Ð½ÐºÑ xml Ñ Ð¸ÑкомÑм знаÑением. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð±ÑÑно XML-знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð¾ÑделÑнÑм клÑÑевÑм полем, напÑÐ¸Ð¼ÐµÑ ID. Ðожно Ñакже ÑÑавниваÑÑ XML-знаÑениÑ, пÑеобÑазовав Ð¸Ñ ÑнаÑала в ÑекÑÑовÑе ÑÑÑоки, но замеÑÑÑе, ÑÑо Ñ ÑÑÑÑом ÑпеÑиÑики XML-даннÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод пÑакÑиÑеÑки беÑполезен.
Ðз-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипа xml, Ð´Ð»Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ ÑÑого Ñипа Ñакже нелÑÐ·Ñ ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ. ÐоÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð³Ð´Ð° ÑÑебÑеÑÑÑ Ð±ÑÑÑÑÑй поиÑк в XML даннÑÑ , обойÑи ÑÑо огÑаниÑение можно, пÑÐ¸Ð²ÐµÐ´Ñ Ð´Ð°Ð½Ð½Ñе к ÑÐ¸Ð¿Ñ ÑекÑÑовой ÑÑÑоки и пÑоиндекÑиÑовав ÑÑи ÑÑÑоки, либо пÑоиндекÑиÑовав вÑÑажение XPath. ÐонеÑно Ñам запÑÐ¾Ñ Ð¿Ñи ÑÑом ÑледÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¸Ñк вÑполнÑлÑÑ Ð¿Ð¾ индекÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð²ÑÑажениÑ.
ÐÐ»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка в XML-даннÑÑ Ñакже можно иÑполÑзоваÑÑ ÑÑнкÑии полноÑекÑÑового поиÑка в PostgreSQL. Ðднако ÑÑо ÑÑебÑÐµÑ Ð¾Ð¿ÑеделÑнной подгоÑовки даннÑÑ , ÑÑо диÑÑÑибÑÑив PostgreSQL пока не поддеÑживаеÑ.
| ÐÑед. | ÐаÑало | След. |
| Тип UUID | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ð¢Ð¸Ð¿Ñ JSON |