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 (ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° оÑлиÑалаÑÑ Ð¾Ñ ÑоÑмаÑа ÑпеÑпоÑледоваÑелÑноÑÑи). РнекоÑоÑÑÑ
конÑекÑÑаÑ
обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð½Ñжно ÑкÑаниÑоваÑÑ, пÑодÑблиÑовав ÐµÑ (Ñм. ÐодÑаздел 4.1.2.1). ÐводимÑе ÑеÑÑнадÑаÑеÑиÑнÑе ÑиÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð² лÑбом ÑегиÑÑÑе, а Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°Ñами ÑиÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Ð¿ÑобелÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (но не внÑÑÑи паÑÑ Ð¸ не в наÑале поÑледоваÑелÑноÑÑи \x). ÐÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ ÑовмеÑÑим Ñо множеÑÑвом внеÑниÑ
пÑиложений и пÑоÑоколов, к ÑÐ¾Ð¼Ñ Ð¶Ðµ обÑÑно пÑеобÑазÑеÑÑÑ Ð±ÑÑÑÑее, поÑÑÐ¾Ð¼Ñ Ð¿ÑедпоÑÑиÑелÑнее иÑполÑзоваÑÑ ÐµÐ³Ð¾.
ÐÑимеÑ:
SET bytea_output = 'hex'; SELECT '\xDEADBEEF'::bytea; bytea ------------ \xdeadbeef
8.4.2. ФоÑÐ¼Ð°Ñ ÑпеÑпоÑледоваÑелÑноÑÑей bytea
ФоÑÐ¼Ð°Ñ Â«ÑпеÑпоÑледоваÑелÑноÑÑей» ÑÑадиÑионно иÑполÑзовалÑÑ Ð² PostgreSQL Ð´Ð»Ñ Ð·Ð½Ð°Ñений Ñипа bytea. РнÑм двоиÑÐ½Ð°Ñ ÑÑÑока пÑедÑÑавлÑеÑÑÑ Ð² виде поÑледоваÑелÑноÑÑи ASCII-Ñимволов, а байÑÑ, непÑедÑÑавимÑе в виде ASCII-Ñимволов, пеÑедаÑÑÑÑ Ð² виде ÑпеÑпоÑледоваÑелÑноÑÑей. ÐÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдобен, еÑли Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавление Ð±Ð°Ð¹Ñ Ð² виде Ñимволов Ð¸Ð¼ÐµÐµÑ ÑмÑÑл. Ðо на пÑакÑике ÑÑо обÑÑно ÑоздаÑÑ Ð¿ÑÑаниÑÑ, Ñак как двоиÑнÑе и ÑимволÑнÑе ÑÑÑоки могÑÑ Ð²ÑглÑдеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, а кÑоме Ñого вÑбÑаннÑй меÑ
анизм ÑпеÑпоÑледоваÑелÑноÑÑей доволÑно неÑклÑж. ÐоÑÑÐ¾Ð¼Ñ Ð² новÑÑ
пÑиложениÑÑ
ÑÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ Ð¾Ð±ÑÑно не ÑÑÐ¾Ð¸Ñ Ð¸ÑполÑзоваÑÑ.
ÐеÑÐµÐ´Ð°Ð²Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ bytea в ÑоÑмаÑе ÑпеÑпоÑледоваÑелÑноÑÑи, байÑÑ Ñ Ð¾Ð¿ÑеделÑннÑми знаÑениÑми необÑ
одимо запиÑÑваÑÑ ÑпеÑиалÑнÑм обÑазом, Ñ
оÑÑ Ñак можно запиÑÑваÑÑ Ð¸ вÑе знаÑениÑ. РобÑем виде Ð´Ð»Ñ ÑÑого знаÑение байÑа нÑжно пÑеобÑазоваÑÑ Ð² ÑÑÑÑ
знаÑное воÑÑмеÑиÑное ÑиÑло и добавиÑÑ Ð¿ÐµÑед ним обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ. Ð¡Ð°Ð¼Ñ Ð¾Ð±ÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ (Ñимвол Ñ Ð´ÐµÑÑÑиÑнÑм кодом 92) можно запиÑаÑÑ Ð² виде двÑÑ
ÑакиÑ
Ñимволов. РТаблиÑе 8.7 пеÑеÑиÑÐ»ÐµÐ½Ñ ÑимволÑ, коÑоÑÑе нÑжно запиÑÑваÑÑ ÑпеÑпоÑледоваÑелÑноÑÑÑми, и пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð°Ð»ÑÑеÑнаÑивнÑе ваÑианÑÑ Ð·Ð°Ð¿Ð¸Ñи, еÑли они возможнÑ.
ТаблиÑа 8.7. СпеÑпоÑледоваÑелÑноÑÑи запиÑи знаÑений bytea
| ÐеÑÑÑиÑное знаÑение байÑа | ÐпиÑание | СпеÑпоÑледоваÑелÑноÑÑÑ Ð²Ð²Ð¾Ð´Ð° | ÐÑÐ¸Ð¼ÐµÑ | ШеÑÑнадÑаÑеÑиÑное пÑедÑÑавление |
|---|---|---|---|---|
| 0 | нÑлевой Ð±Ð°Ð¹Ñ | '\000' | SELECT '\000'::bytea; | \x00 |
| 39 | апоÑÑÑÐ¾Ñ | '''' или '\047' | SELECT ''''::bytea; | \x27 |
| 92 | обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа | '\\' или '\134' | SELECT '\\'::bytea; | \x5c |
| Ð¾Ñ 0 до 31 и Ð¾Ñ 127 до 255 | «непеÑаÑаемÑе» байÑÑ | E'\\ (воÑÑмеÑиÑное знаÑение) | SELECT '\001'::bytea; | \x01 |
ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ ÑкÑаниÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¿ÐµÑаÑаемÑÑ Ñимволов опÑеделÑÑÑÑÑ ÑзÑковÑми ÑÑандаÑÑами. Ðногда Ñакие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ Ð¸ без ÑпеÑпоÑледоваÑелÑноÑÑей.
ÐпоÑÑÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´ÑблиÑоваÑÑÑÑ, как показано в ТаблиÑе 8.7, поÑÐ¾Ð¼Ñ ÑÑо ÑÑо обÑзаÑелÑно Ð´Ð»Ñ Ð»Ñбой ÑекÑÑовой ÑÑÑоки в команде SQL. ÐÑи обÑем ÑазбоÑе ÑекÑÑовой ÑÑÑоки внеÑние апоÑÑÑоÑÑ ÑбиÑаÑÑÑÑ, а ÐºÐ°Ð¶Ð´Ð°Ñ Ð¿Ð°Ñа внÑÑÑенниÑ
ÑводиÑÑÑ Ðº Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑимволÑ. Таким обÑазом, ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° bytea Ð²Ð¸Ð´Ð¸Ñ Ð²Ñего один апоÑÑÑоÑ, коÑоÑÑй она обÑабаÑÑÐ²Ð°ÐµÑ ÐºÐ°Ðº обÑÑнÑй Ñимвол в даннÑÑ
. ÐÑблиÑоваÑÑ Ð¶Ðµ обÑаÑнÑÑ ÐºÐ¾ÑÑÑ ÑеÑÑÑ Ð¿Ñи вводе bytea не ÑÑебÑеÑÑÑ: ÑÑÐ¾Ñ Ñимвол ÑÑиÑаеÑÑÑ Ð¾ÑобÑм и менÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑнкÑии ввода, как показано в ТаблиÑе 8.7.
РнекоÑоÑÑÑ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ Ð¾Ð±ÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа должна дÑблиÑоваÑÑÑÑ (оÑноÑиÑелÑно пÑимеÑов вÑÑе), Ñак как пÑи обÑем ÑазбоÑе ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑÐ°Ð½Ñ Ð¿Ð°Ñа ÑÐ°ÐºÐ¸Ñ Ñимволов бÑÐ´ÐµÑ Ñведена к одномÑ; Ñм. ÐодÑаздел 4.1.2.1.
ÐаннÑе Bytea по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÑводÑÑÑÑ Ð² ÑеÑÑнадÑаÑеÑиÑном ÑоÑмаÑе (hex). ÐÑли поменÑÑÑ Ð·Ð½Ð°Ñение bytea_output на escape, «непеÑаÑаемÑе» байÑÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð² виде ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑÑÑ
знаÑнÑÑ
воÑÑмеÑиÑнÑÑ
знаÑений, коÑоÑÑе пÑедваÑÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ обÑаÑной коÑой ÑеÑÑой. ÐолÑÑинÑÑво «пеÑаÑаемÑÑ
» байÑов пÑедÑÑавлÑÑÑÑÑ Ð¾Ð±ÑÑнÑми Ñимволами из клиенÑÑкого набоÑа Ñимволов, напÑимеÑ:
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
bytea
----------------
abc klm *\251TÐÐ°Ð¹Ñ Ñ Ð´ÐµÑÑÑиÑнÑм кодом 92 (обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа) пÑи вÑводе дÑблиÑÑеÑÑÑ. ÐÑо иллÑÑÑÑиÑÑÐµÑ Ð¢Ð°Ð±Ð»Ð¸Ñа 8.8.
ТаблиÑа 8.8. СпеÑпоÑледоваÑелÑноÑÑи вÑÑ
однÑÑ
знаÑений bytea
| ÐеÑÑÑиÑное знаÑение байÑа | ÐпиÑание | СпеÑпоÑледоваÑелÑноÑÑÑ Ð²Ñвода | ÐÑÐ¸Ð¼ÐµÑ | ÐÑводимÑй ÑезÑлÑÑÐ°Ñ |
|---|---|---|---|---|
| 92 | обÑаÑÐ½Ð°Ñ ÐºÐ¾ÑÐ°Ñ ÑеÑÑа | \\ | SELECT '\134'::bytea; | \\ |
| Ð¾Ñ 0 до 31 и Ð¾Ñ 127 до 255 | «непеÑаÑаемÑе» байÑÑ | \ (знаÑение байÑа) | SELECT '\001'::bytea; | \001 |
| Ð¾Ñ 32 до 126 | «пеÑаÑаемÑе» байÑÑ | пÑедÑÑавление из клиенÑÑкого набоÑа Ñимволов | SELECT '\176'::bytea; | ~ |
РзавиÑимоÑÑи Ð¾Ñ Ð¿ÑименÑемой клиенÑÑкой библиоÑеки PostgreSQL, Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений bytea в ÑпеÑÑÑÑоки и обÑаÑно могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе дейÑÑвиÑ. ÐапÑимеÑ, еÑли пÑиложение ÑоÑ
ÑанÑÐµÑ Ð² ÑÑÑокаÑ
ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑевода ÑÑÑок, возможно иÑ
Ñакже нÑжно бÑÐ´ÐµÑ Ð¿ÑедÑÑавиÑÑ ÑпеÑпоÑледоваÑелÑноÑÑÑми.