| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ðлава 8. Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ | След. |
8.4. ÐвоиÑнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÐÐ»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð²Ð¾Ð¸ÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¿ÑедназнаÑен Ñип bytea; Ñм. ТаблиÑÑ 8-6.
ТаблиÑа 8-6. ÐвоиÑнÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
| ÐÐ¼Ñ | Ð Ð°Ð·Ð¼ÐµÑ | ÐпиÑание |
|---|---|---|
| bytea | 1 или 4 байÑа плÑÑ Ñама двоиÑÐ½Ð°Ñ ÑÑÑока | двоиÑÐ½Ð°Ñ ÑÑÑока пеÑеменной Ð´Ð»Ð¸Ð½Ñ |
ÐвоиÑнÑе ÑÑÑоки пÑедÑÑавлÑÑÑ Ñобой поÑледоваÑелÑноÑÑÑ Ð¾ÐºÑеÑов (байÑ) и имеÑÑ Ð´Ð²Ð° оÑлиÑÐ¸Ñ Ð¾Ñ ÑекÑÑовÑÑ ÑÑÑок. Ðо-пеÑвÑÑ , в двоиÑнÑÑ ÑÑÑÐ¾ÐºÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ ÑаниÑÑ Ð±Ð°Ð¹ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 0 и дÑÑгими "непеÑаÑаемÑми" знаÑениÑми (обÑÑно ÑÑо знаÑÐµÐ½Ð¸Ñ Ð²Ð½Ðµ диапазона 32..126). Ð ÑекÑÑовÑÑ ÑÑÑÐ¾ÐºÐ°Ñ Ð½ÐµÐ»ÑÐ·Ñ ÑÐ¾Ñ ÑанÑÑÑ Ð½ÑлевÑе байÑÑ, а Ñакже знаÑÐµÐ½Ð¸Ñ Ð¸ поÑледоваÑелÑноÑÑи знаÑений, не ÑооÑвеÑÑÑвÑÑÑие вÑбÑанной кодиÑовке Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ðо-вÑоÑÑÑ , в опеÑаÑиÑÑ Ñ Ð´Ð²Ð¾Ð¸ÑнÑми ÑÑÑоками обÑабаÑÑваÑÑÑÑ Ð±Ð°Ð¹ÑÑ Ð² ÑиÑÑом виде, Ñогда как ÑекÑÑовÑе ÑÑÑоки обÑабаÑÑваÑÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑзÑковÑÑ ÑÑандаÑÑов. То еÑÑÑ, двоиÑнÑе ÑÑÑоки болÑÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе пÑогÑаммиÑÑ Ð²Ð¸Ð´Ð¸Ñ ÐºÐ°Ðº "пÑоÑÑо байÑÑ", а ÑимволÑнÑе ÑÑÑоки — Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑекÑÑа.
Тип bytea поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ð° внеÑÐ½Ð¸Ñ ÑоÑмаÑа ввода и вÑвода: ÑÑадиÑионнÑй Ð´Ð»Ñ PostgreSQL ÑоÑÐ¼Ð°Ñ "ÑпеÑпоÑледоваÑелÑноÑÑей" и "ÑеÑÑнадÑаÑеÑиÑнÑй". ÐÑ Ð¾Ð´Ð½Ñе даннÑе пÑинимаÑÑÑÑ Ð² Ð¾Ð±Ð¾Ð¸Ñ ÑоÑмаÑÐ°Ñ , а ÑоÑÐ¼Ð°Ñ Ð²ÑÑ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ð¿Ð°ÑамеÑÑа конÑигÑÑаÑии bytea_output; по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÑбÑан ÑеÑÑнадÑаÑеÑиÑнÑй. (ÐамеÑÑÑе, ÑÑо ÑеÑÑнадÑаÑеÑиÑнÑй ÑоÑÐ¼Ð°Ñ Ð±Ñл введÑн в PostgreSQL 9.0; в ÑÐ°Ð½Ð½Ð¸Ñ Ð²ÐµÑÑиÑÑ Ð¸ некоÑоÑÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ Ð¾Ð½ не бÑÐ´ÐµÑ ÑабоÑаÑÑ.)
СÑандаÑÑ SQL опÑеделÑÐµÑ Ð´ÑÑгой Ñип двоиÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ , BLOB (BINARY LARGE OBJECT, болÑÑой двоиÑнÑй обÑекÑ). Ðго Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑоÑÐ¼Ð°Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ ÑоÑмаÑов bytea, но ÑÑнкÑии и опеÑаÑоÑÑ Ð² оÑновном Ñе же.
8.4.1. ШеÑÑнадÑаÑеÑиÑнÑй ÑоÑÐ¼Ð°Ñ bytea
Ð "ÑеÑÑнадÑаÑеÑиÑном" ÑоÑмаÑе двоиÑнÑе даннÑе кодиÑÑÑÑÑÑ Ð´Ð²ÑÐ¼Ñ ÑеÑÑнадÑаÑеÑиÑнÑми ÑиÑÑами на байÑ, пÑи ÑÑом пеÑÐ²Ð°Ñ ÑиÑÑа ÑооÑвеÑÑÑвÑÐµÑ ÑÑаÑÑим 4 биÑам. РполÑÑенной ÑÑÑоке добавлÑеÑÑÑ Ð¿ÑеÑÐ¸ÐºÑ \x (ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° оÑлиÑалаÑÑ Ð¾Ñ ÑоÑмаÑа ÑпеÑпоÑледоваÑелÑноÑÑи). РнекоÑоÑÑÑ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð½Ñжно вÑделиÑÑ, пÑодÑблиÑовав еÑ, в ÑÐµÑ Ð¶Ðµ ÑлÑÑаÑÑ ÑÑо нÑжно ÑделаÑÑ Ð´Ð»Ñ ÑоÑмаÑа ÑпеÑпоÑледоваÑелÑноÑÑи; подÑобнее ÑÑо опиÑано ниже. ШеÑÑнадÑаÑеÑиÑнÑе ÑиÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð² лÑбом ÑегиÑÑÑе, а Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°Ñами ÑиÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Ð¿ÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (но не внÑÑÑи паÑÑ Ð¸ не в наÑале поÑледоваÑелÑноÑÑи \x). ÐÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ ÑовмеÑÑим Ñо множеÑÑвом внеÑÐ½Ð¸Ñ Ð¿Ñиложений и пÑоÑоколов, к ÑÐ¾Ð¼Ñ Ð¶Ðµ обÑÑно пÑеобÑазÑеÑÑÑ Ð±ÑÑÑÑее, поÑÑÐ¾Ð¼Ñ Ð¿ÑедпоÑÑиÑелÑнее иÑполÑзоваÑÑ ÐµÐ³Ð¾.
ÐÑимеÑ:
SELECT E'\\xDEADBEEF';
8.4.2. ФоÑÐ¼Ð°Ñ ÑпеÑпоÑледоваÑелÑноÑÑей bytea
ФоÑÐ¼Ð°Ñ "ÑпеÑпоÑледоваÑелÑноÑÑей" ÑÑадиÑионно иÑполÑзовалÑÑ Ð² PostgreSQL Ð´Ð»Ñ Ð·Ð½Ð°Ñений Ñипа bytea. РнÑм двоиÑÐ½Ð°Ñ ÑÑÑока пÑедÑÑавлÑеÑÑÑ Ð² виде поÑледоваÑелÑноÑÑи ASCII-Ñимволов, а байÑÑ, непÑедÑÑавимÑе в виде ASCII-Ñимволов, пеÑедаÑÑÑÑ Ð² виде ÑпеÑпоÑледоваÑелÑноÑÑей. ÐÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдобен, еÑли Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавление Ð±Ð°Ð¹Ñ Ð² виде Ñимволов Ð¸Ð¼ÐµÐµÑ ÑмÑÑл. Ðо на пÑакÑике ÑÑо обÑÑно ÑоздаÑÑ Ð¿ÑÑаниÑÑ, Ñак как двоиÑнÑе и ÑимволÑнÑе ÑÑÑоки могÑÑ Ð²ÑглÑдеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, а кÑоме Ñого вÑбÑаннÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ ÑпеÑпоÑледоваÑелÑноÑÑей доволÑно неÑклÑж. ÐоÑÑÐ¾Ð¼Ñ Ð² новÑÑ Ð¿ÑиложениÑÑ ÑÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ Ð¾Ð±ÑÑно не ÑÑÐ¾Ð¸Ñ Ð¸ÑполÑзоваÑÑ.
ÐеÑÐµÐ´Ð°Ð²Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ bytea в ÑоÑмаÑе ÑпеÑпоÑледоваÑелÑноÑÑи, байÑÑ Ñ Ð¾Ð¿ÑеделÑннÑми знаÑениÑми Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ запиÑÑваÑÑ ÑпеÑиалÑнÑм обÑазом, Ñ Ð¾ÑÑ Ñак можно запиÑÑваÑÑ Ð¸ вÑе знаÑениÑ. РобÑем виде Ð´Ð»Ñ ÑÑого знаÑение байÑа нÑжно пÑеобÑазоваÑÑ Ð² ÑÑÑÑ Ð·Ð½Ð°Ñное воÑÑмеÑиÑное ÑиÑло и добавиÑÑ Ð¿ÐµÑед ним обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ (и пÑодÑблиÑоваÑÑ ÐµÑ, еÑли знаÑение запиÑÑваеÑÑÑ Ð² ÑекÑÑовой ÑпеÑÑÑÑоке). Ð¡Ð°Ð¼Ñ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ (Ñимвол Ñ ÐºÐ¾Ð´Ð¾Ð¼ 92) можно запиÑаÑÑ Ð² виде двÑÑ ÑÐ°ÐºÐ¸Ñ Ñимволов. РТаблиÑе 8-7 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑимволÑ, коÑоÑÑе нÑжно запиÑÑваÑÑ ÑпеÑпоÑледоваÑелÑноÑÑÑми, и пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð°Ð»ÑÑеÑнаÑивнÑе ваÑианÑÑ Ð·Ð°Ð¿Ð¸Ñи Ñам, где они возможнÑ.
ТаблиÑа 8-7. СпеÑпоÑледоваÑелÑноÑÑи запиÑи знаÑений bytea
| ÐеÑÑÑиÑное знаÑение байÑа | ÐпиÑание | СпеÑпоÑледова- ÑелÑноÑÑÑ Ð²Ð²Ð¾Ð´Ð° | ÐÑÐ¸Ð¼ÐµÑ | ÐÑводимое пÑедÑÑавление |
|---|---|---|---|---|
| 0 | нÑлевой Ð±Ð°Ð¹Ñ | E'\\000' | SELECT E'\\000'::bytea; | \000 |
| 39 | апоÑÑÑÐ¾Ñ | '''' или E'\\047' | SELECT E'\''::bytea; | ' |
| 92 | обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа | E'\\\\' или E'\\134' | SELECT E'\\\\'::bytea; | \\ |
| Ð¾Ñ 0 до 31 и Ð¾Ñ 127 до 255 | "непеÑаÑаемÑе" байÑÑ | E'\\xxx' (знаÑение байÑа) | SELECT E'\\001'::bytea; | \001 |
ÐÐ°Ð±Ð¾Ñ Ð½ÐµÐ¿ÐµÑаÑаемÑÑ Ñимволов, коÑоÑÑе нÑжно запиÑÑваÑÑ ÑпеÑпоÑледоваÑелÑноÑÑÑми, опÑеделÑеÑÑÑ ÑзÑковÑми ÑÑандаÑÑами. РнекоÑоÑÑÑ ÑлÑÑаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑÑавиÑÑ Ð² бÑквалÑном виде и дÑÑгие ÑимволÑ. ÐамеÑÑÑе, ÑÑо во вÑÐµÑ Ð¿ÑимеÑÐ°Ñ Ð² ТаблиÑе 8-7 задаÑÑÑÑ Ð·Ð½Ð°Ñение Ñовно одного байÑа, Ñ Ð¾ÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ðµ пÑедÑÑавление Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· неÑколÑÐºÐ¸Ñ Ñимволов.
ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð´ÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑ Ð² запиÑи ÑпеÑпоÑледоваÑелÑноÑÑей, показанного в ТаблиÑе 8-7, обÑÑÑнÑеÑÑÑ Ñем, ÑÑо ÑÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа должна пÑойÑи два ÑÑапа ÑазбоÑа на ÑеÑвеÑе PostgreSQL. ÐеÑÐ²Ð°Ñ Ð¾Ð±ÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа из каждой паÑÑ Ð²Ð¾ÑпÑинимаеÑÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑом ÑÑÑоки как ÑпеÑÑимвол (еÑли иÑполÑзÑеÑÑÑ ÑинÑакÑÐ¸Ñ ÑпеÑпоÑледоваÑелÑноÑÑей) и Ñаким обÑазом пÑопÑÑкаеÑÑÑ, оÑÑавлÑÑ ÑолÑко вÑоÑÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ. (ÐÐ»Ñ Ð¸Ð·Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ ÑÑой вложенноÑÑи можно иÑполÑзоваÑÑ ÑÑÑоки в доллаÑÐ°Ñ .) ÐÑÑавÑаÑÑÑ Ð¾Ð±ÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа заÑем ÑаÑпознаÑÑÑÑ ÑÑнкÑией ввода bytea как ÑпеÑÑимвол, пÑедваÑÑÑÑий ÑÑÑÑ Ð·Ð½Ð°Ñное воÑÑмеÑиÑное знаÑение или ÑледÑÑÑий ÑпеÑÑимвол. ÐапÑимеÑ, пеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ ÑеÑвеÑÑ ÑÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа E'\\001' пÑеобÑазÑеÑÑÑ Ð² \001, пÑÐ¾Ñ Ð¾Ð´Ñ ÑеÑез анализаÑÐ¾Ñ ÑпеÑÑÑÑок. ÐаÑем ÑÑÑока \001 пеÑедаÑÑÑÑ ÑÑнкÑии ввода Ñипа bytea, где она пÑеобÑазÑеÑÑÑ Ð² один Ð±Ð°Ð¹Ñ Ñ Ð´ÐµÑÑÑиÑнÑм знаÑением 1. ÐамеÑÑÑе, ÑÑо Ñимвол апоÑÑÑÐ¾Ñ Ð´Ð»Ñ ÑÑнкÑии ввода bytea не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¾ÑÑалÑнÑÑ , поÑÑÐ¾Ð¼Ñ Ð¾Ð½ запиÑÑваеÑÑÑ ÐºÐ°Ðº обÑÑно пÑинÑÑо в ÑÑÑÐ¾ÐºÐ°Ñ . (См. Ñакже ÐодÑаздел 4.1.2.1.)
ÐаннÑе bytea иногда вÑводÑÑÑÑ Ñакже в ÑпеÑпоÑледоваÑелÑноÑÑÑÑ . ÐÑи ÑÑом каждÑй "непеÑаÑаемÑй" Ð±Ð°Ð¹Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ð² виде ÑÑÑÑ Ð·Ð½Ð°Ñного воÑÑмеÑиÑного знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле обÑаÑной коÑой ÑеÑÑÑ. ÐолÑÑинÑÑво "пеÑаÑаемÑÑ " Ð±Ð°Ð¹Ñ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми Ñимволами из клиенÑÑкого набоÑа Ñимволов. ÐÐ°Ð¹Ñ Ñ Ð´ÐµÑÑÑиÑнÑм кодом 92 (обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа) пÑи вÑводе дÑблиÑÑеÑÑÑ. ÐÑо иллÑÑÑÑиÑÑÐµÑ Ð¢Ð°Ð±Ð»Ð¸Ñа 8-8.
ТаблиÑа 8-8. СпеÑпоÑледоваÑелÑноÑÑи вÑÑ Ð¾Ð´Ð½ÑÑ Ð·Ð½Ð°Ñений bytea
| ÐеÑÑÑиÑное знаÑение байÑа | ÐпиÑание | СпеÑпоÑледоваÑелÑноÑÑÑ Ð²Ñвода | ÐÑÐ¸Ð¼ÐµÑ | ÐÑводимÑй ÑезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
| 92 | обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа | \\ | SELECT E'\\134'::bytea; | \\ |
| Ð¾Ñ 0 до 31 и Ð¾Ñ 127 до 255 | "непеÑаÑаемÑе" байÑÑ | \xxx (знаÑение байÑа) | SELECT E'\\001'::bytea; | \001 |
| Ð¾Ñ 32 до 126 | "пеÑаÑаемÑе" байÑÑ | пÑедÑÑавление из клиенÑÑкого набоÑа Ñимволов | SELECT E'\\176'::bytea; | ~ |
РзавиÑимоÑÑи Ð¾Ñ Ð¿ÑименÑемой клиенÑÑкой библиоÑеки PostgreSQL, Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений bytea в ÑпеÑÑÑÑоки и обÑаÑно могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дейÑÑвиÑ. ÐапÑимеÑ, еÑли пÑиложение ÑÐ¾Ñ ÑанÑÐµÑ Ð² ÑÑÑÐ¾ÐºÐ°Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑевода ÑÑÑок, возможно Ð¸Ñ Ñакже нÑжно бÑÐ´ÐµÑ Ð¿ÑедÑÑавиÑÑ ÑпеÑпоÑледоваÑелÑноÑÑÑми.
| ÐÑед. | ÐаÑало | След. |
| СимволÑнÑе ÑÐ¸Ð¿Ñ | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | Ð¢Ð¸Ð¿Ñ Ð´Ð°ÑÑ/вÑемени |