22.2. ÐоддеÑжка пÑавил ÑоÑÑиÑовки #
ÐÑавила ÑоÑÑиÑовки позволÑÑÑ ÑÑÑанавливаÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки и оÑобенноÑÑи клаÑÑиÑикаÑии Ñимволов в оÑделÑнÑÑ
ÑÑолбÑаÑ
или даже пÑи вÑполнении оÑделÑнÑÑ
опеÑаÑий. ÐÑо ÑмÑгÑÐ°ÐµÑ Ð¿Ð¾ÑледÑÑÐ²Ð¸Ñ Ñого, ÑÑо паÑамеÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
LC_COLLATE и LC_CTYPE невозможно измениÑÑ Ð¿Ð¾Ñле ÐµÑ ÑозданиÑ.
22.2.1. ÐÑновнÑе понÑÑÐ¸Ñ #
ÐонÑепÑÑалÑно, каждое вÑÑажение Ñ Ñипом даннÑÑ
, к коÑоÑÐ¾Ð¼Ñ Ð¿ÑименÑеÑÑÑ ÑоÑÑиÑовка, Ð¸Ð¼ÐµÐµÑ Ð¿Ñавила ÑоÑÑиÑовки. (ÐÑÑÑоеннÑми ÑоÑÑиÑÑемÑми Ñипами даннÑÑ
ÑвлÑÑÑÑÑ text, varchar, и char. ТипÑ, опÑеделÑемÑе в базе полÑзоваÑелем, могÑÑ Ñакже бÑÑÑ Ð¾ÑмеÑÐµÐ½Ñ ÐºÐ°Ðº ÑоÑÑиÑÑемÑе, и, конеÑно, домен на оÑнове ÑоÑÑиÑÑемого Ñипа даннÑÑ
ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑм.) ÐÑли вÑÑажение ÑодеÑÐ¶Ð¸Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑолбеÑ, пÑавила ÑоÑÑиÑовки вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¿Ñавилами ÑоÑÑиÑовки ÑÑолбÑа. ÐÑли вÑÑажение â конÑÑанÑа, пÑавилами ÑоÑÑиÑовки ÑвлÑÑÑÑÑ ÑÑандаÑÑнÑе пÑавила Ð´Ð»Ñ Ñипа даннÑÑ
конÑÑанÑÑ. ÐÑавила ÑоÑÑиÑовки более ÑложнÑÑ
вÑÑажений ÑвлÑÑÑÑÑ Ð¿Ñоизводной Ð¾Ñ Ð¿Ñавил ÑоÑÑиÑовки вÑ
одÑÑиÑ
в него ÑаÑÑей, как опиÑано ниже.
ÐÑавилами ÑоÑÑиÑовки вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿Ñавила ÑоÑÑиÑовки «по ÑмолÑаниÑ», ÑÑо ознаÑÐ°ÐµÑ Ð¸ÑполÑзование паÑамеÑÑов локали, ÑÑÑановленнÑÑ Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Также возможно, ÑÑо пÑавила ÑоÑÑиÑовки вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð½Ðµ опÑеделиÑÑÑÑ. Ð ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¾Ð¿ÐµÑаÑии ÑпоÑÑдоÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¸ дÑÑгие опеÑаÑии, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñ Ð¿Ñавила ÑоÑÑиÑовки, завеÑÑаÑÑÑ Ñ Ð¾Ñибкой.
Ðогда база даннÑÑ
должна вÑполниÑÑ ÑпоÑÑдоÑивание или клаÑÑиÑикаÑÐ¸Ñ Ñимволов, она иÑполÑзÑÐµÑ Ð¿Ñавила ÑоÑÑиÑовки вÑполнÑемого вÑÑажениÑ. ÐÑо пÑоиÑÑ
одиÑ, к пÑимеÑÑ, Ñ Ð¿ÑедложениÑми ORDER BY и Ñакими вÑзовами ÑÑнкÑий или опеÑаÑоÑов как <. ÐÑавила ÑоÑÑиÑовки, коÑоÑÑе пÑименÑÑÑÑÑ Ð² пÑедложении ORDER BY, ÑÑо пÑоÑÑо пÑавила клÑÑа ÑоÑÑиÑовки. ÐÑавила ÑоÑÑиÑовки, пÑименÑемÑе к вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии или опеÑаÑоÑа, опÑеделÑÑÑÑÑ Ð¸Ñ
паÑамеÑÑами, как опиÑано ниже. Рдополнение к опеÑаÑиÑм ÑÑавнениÑ, пÑавила ÑоÑÑиÑовки ÑÑиÑÑваÑÑÑÑ ÑÑнкÑиÑми, пÑеобÑазÑÑÑими ÑегиÑÑÑ Ñимволов, Ñакими как lower, upper, и initcap; опеÑаÑоÑами поиÑка по ÑаблонÑ; и ÑÑнкÑией to_char и ÑвÑзаннÑми Ñ Ð½ÐµÐ¹.
ÐÑи вÑзове ÑÑнкÑии или опеÑаÑоÑа пÑавило ÑоÑÑиÑовки опÑеделÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ñого, какие пÑавила Ð·Ð°Ð´Ð°Ð½Ñ Ð´Ð»Ñ Ð°ÑгÑменÑов во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ опеÑаÑии. ÐÑли ÑезÑлÑÑаÑом вÑзова ÑÑнкÑии или опеÑаÑоÑа ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑй Ñип даннÑÑ , пÑавила ÑоÑÑиÑовки Ñакже иÑполÑзÑÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÑазбоÑа как опÑеделÑемÑе пÑавила ÑоÑÑиÑовки ÑÑнкÑии или вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа, когда Ð´Ð»Ñ Ð²Ð½ÐµÑнего вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑебÑеÑÑÑ Ð·Ð½Ð°Ð½Ð¸Ðµ пÑавил ÑоÑÑиÑовки.
ÐпÑеделение пÑавил ÑоÑÑиÑовки вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑвнÑм или ÑвнÑм. ÐÑо оÑлиÑие влиÑÐµÑ Ð½Ð° Ñо, как комбиниÑÑÑÑÑÑ Ð¿Ñавила ÑоÑÑиÑовки, когда неÑколÑко ÑазнÑÑ
пÑавил поÑвлÑÑÑÑÑ Ð² вÑÑажении. Явное опÑеделение пÑавил ÑоÑÑиÑовки возникаеÑ, когда иÑполÑзÑеÑÑÑ Ð¿Ñедложение COLLATE; вÑе пÑоÑие ваÑианÑÑ ÑвлÑÑÑÑÑ Ð½ÐµÑвнÑми. Ðогда необÑ
одимо обÑединиÑÑ Ð½ÐµÑколÑко пÑавил ÑоÑÑиÑовки, напÑимеÑ, в вÑзове ÑÑнкÑии, иÑполÑзÑÑÑÑÑ ÑледÑÑÑие пÑавила:
ÐÑли Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из вÑÑажений-аÑгÑменÑов пÑавило ÑоÑÑиÑовки опÑеделено Ñвно, Ñо и Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ð°ÑгÑменÑов Ñвно задаваемое пÑавило должно бÑÑÑ Ñем же, инаÑе Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка. Ð ÑлÑÑае пÑиÑÑÑÑÑÐ²Ð¸Ñ Ñвного опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñавила ÑоÑÑиÑовки, оно ÑÑановиÑÑÑ ÑезÑлÑÑиÑÑÑÑим Ð´Ð»Ñ Ð²Ñей опеÑаÑии.
РпÑоÑивном ÑлÑÑае вÑе Ð²Ñ Ð¾Ð´Ð½Ñе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¸ и Ñе же неÑвно опÑеделÑемÑе пÑавила ÑоÑÑиÑовки или пÑавила ÑоÑÑиÑовки по ÑмолÑаниÑ. ÐÑли пÑиÑÑÑÑÑвÑÑÑ ÐºÐ°ÐºÐ¸Ðµ- либо пÑавила ÑоÑÑиÑовки, оÑлиÑнÑе Ð¾Ñ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ ÑмолÑаниÑ, полÑÑаем ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñии пÑавил ÑоÑÑиÑовки. ÐнаÑе ÑезÑлÑÑаÑом ÑÑанÑÑ Ð¿Ñавила ÑоÑÑиÑовки, заданнÑе по ÑмолÑаниÑ.
ÐÑли ÑÑеди Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð²ÑÑажений еÑÑÑ ÐºÐ¾Ð½ÑликÑÑÑÑие неÑвнÑе пÑавила ÑоÑÑиÑовки, оÑлиÑнÑе Ð¾Ñ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ ÑмолÑаниÑ, Ñогда комбинаÑÐ¸Ñ ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº имеÑÑÐ°Ñ Ð½ÐµÐ¾Ð¿ÑеделÑннÑе пÑавила ÑоÑÑиÑовки. ÐÑо не ÑвлÑеÑÑÑ ÑÑловием Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾Ñибки, еÑли вÑзÑваемой конкÑеÑной ÑÑнкÑии не ÑÑебÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе о пÑÐ°Ð²Ð¸Ð»Ð°Ñ ÑоÑÑиÑовки, коÑоÑÑе ей ÑледÑÐµÑ Ð¿ÑимениÑÑ. ÐÑли же Ñакие даннÑе ÑÑебÑÑÑÑÑ, ÑÑо пÑиведÑÑ Ðº оÑибке во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.
РкаÑеÑÑве пÑимеÑа ÑаÑÑмоÑÑим данное опÑеделение ÑаблиÑÑ:
CREATE TABLE test1 (
a text COLLATE "ru_RU",
b text COLLATE "es_ES",
...
);ÐаÑем в
SELECT a < 'foo' FROM test1;
вÑполнÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ < ÑоглаÑно пÑавилам ru_RU, Ñак как вÑÑажение обÑединÑÐµÑ Ð½ÐµÑвно опÑеделÑемÑе пÑавила ÑоÑÑиÑовки Ñ Ð¿Ñавилами, заданнÑми по ÑмолÑаниÑ. Ðо в
SELECT a < ('foo' COLLATE "fr_FR") FROM test1; ÑÑавнение вÑполнÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿Ñавил fr_FR, Ñак как Ñвное опÑеделение пÑавил ÑоÑÑиÑовки пеÑеопÑеделÑÐµÑ Ð½ÐµÑвное. ÐÑоме Ñого, в запÑоÑе
SELECT a < b FROM test1;
анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑов не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ, какое пÑавило ÑоÑÑиÑовки иÑполÑзоваÑÑ, поÑколÑÐºÑ ÑÑолбÑÑ a и b имеÑÑ ÐºÐ¾Ð½ÑликÑÑÑÑие неÑвнÑе пÑавила ÑоÑÑиÑовки. Так как опеÑаÑоÑÑ < ÑÑебÑеÑÑÑ Ð·Ð½Ð°ÑÑ, какое пÑавило иÑполÑзоваÑÑ, ÑÑо пÑиведÑÑ Ðº оÑибке. ÐÑÐ¸Ð±ÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑÑÑаниÑÑ, пÑименив Ñвное Ñказание пÑавил ÑоÑÑиÑовки к лÑÐ±Ð¾Ð¼Ñ Ð¸Ð· двÑÑ
вÑ
однÑÑ
вÑÑажений. ÐапÑимеÑ:
SELECT a < b COLLATE "ru_RU" FROM test1;
либо ÑквиваленÑное емÑ
SELECT a COLLATE "ru_RU" < b FROM test1;
С дÑÑгой ÑÑоÑонÑ, ÑледÑÑÑее вÑÑажение ÑÑ Ð¾Ð¶ÐµÐ¹ ÑÑÑÑкÑÑÑÑ
SELECT a || b FROM test1;
не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибке, поÑколÑÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа || пÑавила ÑоÑÑиÑовки не имеÑÑ Ð·Ð½Ð°ÑениÑ, Ñак как ÑезÑлÑÑÐ°Ñ Ð½Ðµ завиÑÐ¸Ñ Ð¾Ñ ÑоÑÑиÑовки.
ÐÑавила ÑоÑÑиÑовки, назнаÑеннÑе ÑÑнкÑии или комбинаÑии Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð²ÑÑажений опеÑаÑоÑа, Ñакже могÑÑ Ð±ÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ñ Ðº ÑÑнкÑии или ÑезÑлÑÑаÑÑ Ð¾Ð¿ÐµÑаÑоÑа, еÑли ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ опеÑаÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑезÑлÑÑÐ°Ñ ÑоÑÑиÑÑемого Ñипа даннÑÑ . Так, в
SELECT * FROM test1 ORDER BY a || 'foo';
ÑпоÑÑдоÑение бÑÐ´ÐµÑ Ð¿ÑоиÑÑ
одиÑÑ ÑоглаÑно пÑавилам ru_RU. Ðо даннÑй запÑоÑ:
SELECT * FROM test1 ORDER BY a || b;
пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибке, поÑÐ¾Ð¼Ñ ÑÑо, даже еÑли опеÑаÑоÑÑ || не нÑжно знаÑÑ Ð¿Ñавила ÑоÑÑиÑовки, пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY ÑÑо ÑÑебÑеÑÑÑ. Ðак бÑло Ñказано вÑÑе, конÑÐ»Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазÑеÑÑн пÑи помоÑи Ñвного ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ñавил ÑоÑÑиÑовки:
SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
22.2.2. УпÑавление пÑавилами ÑоÑÑиÑовки #
ÐÑавила ÑоÑÑиÑовки пÑедÑÑавлÑÑÑ Ñобой обÑÐµÐºÑ ÑÑ
ÐµÐ¼Ñ SQL, коÑоÑÑй ÑопоÑÑавлÑÐµÑ SQL-Ð¸Ð¼Ñ Ñ Ð»Ð¾ÐºÐ°Ð»ÑÑ, ÑеализÑемой библиоÑекой, ÑÑÑановленной в опеÑаÑионной ÑиÑÑеме. РопÑеделении пÑавила ÑоÑÑиÑовки задаÑÑÑÑ Ð¿ÑовайдеÑ, Ñо еÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека, ÑеализÑÑÑÐ°Ñ Ð¿Ñавило ÑоÑÑиÑовки. СÑандаÑÑнÑй пÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ libc иÑполÑзÑÐµÑ ÑиÑÑемнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ C и пÑедоÑÑавлÑÐµÑ ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ð¸. Ðменно ÑÑи локали иÑполÑзÑÑÑÑÑ Ð±Ð¾Ð»ÑÑинÑÑвом ÑÑÐ¸Ð»Ð¸Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑемÑ. Также еÑÑÑ Ð¿ÑÐ¾Ð²Ð°Ð¹Ð´ÐµÑ icu, коÑоÑÑй иÑполÑзÑÐµÑ Ð²Ð½ÐµÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ ICU. Ðокали ICU можно иÑполÑзоваÑÑ, ÑолÑко еÑли поддеÑжка ICU бÑла вклÑÑена в конÑигÑÑаÑии ÑбоÑки Postgres Pro.
ÐÑавило ÑоÑÑиÑовки, пÑедоÑÑавлÑемое пÑовайдеÑом libc, ÑопоÑÑавлÑеÑÑÑ Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñией паÑамеÑÑов LC_COLLATE и LC_CTYPE, коÑоÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ ÑиÑÑемнÑй вÑзов setlocale(). (ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÐµÐ»Ñ Ð¿Ñавила ÑоÑÑиÑовки â наÑÑÑоиÑÑ Ð¿Ð°ÑамеÑÑ LC_COLLATE, коÑоÑÑй ÑпÑавлÑÐµÑ ÑпоÑÑдоÑиванием Ñимволов. Ðднако на пÑакÑике Ñедко ÑÑебÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение LC_CTYPE, оÑлиÑное Ð¾Ñ LC_COLLATE, поÑÑÐ¾Ð¼Ñ Ñдобнее обÑединиÑÑ Ð¸Ñ
в Ð¾Ð´Ð½Ñ ÑÑÑноÑÑÑ, и не ÑоздаваÑÑ Ð¾ÑделÑнÑÑ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ Ð´Ð»Ñ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ LC_CTYPE в вÑÑажениÑÑ
.) ÐÑавила ÑоÑÑиÑовки libc Ñакже ÑвÑÐ·Ð°Ð½Ñ Ñ ÐºÐ¾Ð´Ð¸Ñовкой набоÑа Ñимволов (Ñм. Раздел 22.3). Ðдно и Ñо же Ð¸Ð¼Ñ Ð¿Ñавила ÑоÑÑиÑовки Ð¼Ð¾Ð¶ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð´Ð»Ñ ÑазнÑÑ
кодиÑовок.
ÐбÑÐµÐºÑ Ð¿Ñавила ÑоÑÑиÑовки, пÑедоÑÑавлÑемой пÑовайдеÑом icu, ÑопоÑÑавлÑеÑÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñм ÑоÑÑиÑовÑиком, ÑеализÑемÑм библиоÑекой ICU. ICU не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазлиÑнÑе Ñ
аÑакÑеÑиÑÑики «collate» и «ctype», Ñак ÑÑо они вÑегда ÑовпадаÑÑ. ÐÑоме Ñого, пÑавила ÑоÑÑиÑовки ICU не завиÑÑÑ Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки, Ñак ÑÑо в базе даннÑÑ
бÑÐ´ÐµÑ Ð²Ñего одно пÑавило ÑоÑÑиÑовки ICU Ñ Ð¾Ð¿ÑеделÑннÑм именем.
22.2.2.1. СÑандаÑÑнÑе пÑавила ÑоÑÑиÑовки #
Ðа вÑÐµÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ ÑледÑÑÑие пÑавила ÑоÑÑиÑовки:
unicodeÐÑо пÑавило ÑоÑÑиÑовки иÑполÑзÑÐµÑ ÐлгоÑиÑм ÑоÑÑиÑовки Unicode Ñ Ð¢Ð°Ð±Ð»Ð¸Ñей ÑоÑÑиÑовки Ñимволов Unicode по ÑмолÑаниÑ. Ðно доÑÑÑпно во вÑÐµÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÐ°Ñ . ÐÐ»Ñ ÐµÐ³Ð¾ иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑебÑеÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка ICU, и поведение завиÑÐ¸Ñ Ð¾Ñ Ñого, ÐºÐ°ÐºÐ°Ñ Ð²ÐµÑÑÐ¸Ñ ICU иÑполÑзÑеÑÑÑ Ð² данной ÑбоÑке Postgres Pro. (ÐÑо пÑавило ÑоÑÑиÑовки ÑабоÑÐ°ÐµÑ Ñак же, как и коÑÐ½ÐµÐ²Ð°Ñ Ð»Ð¾ÐºÐ°Ð»Ñ ICU; Ñм.
und-x-icu(«undefined», неопÑеделÑннаÑ).)ucs_basicС ÑÑим ÑÑандаÑÑнÑм пÑавилом SQL ÑоÑÑиÑовка вÑполнÑеÑÑÑ Ð¿Ð¾ кодам Ñимволов Unicode, а не в поÑÑдке, пÑинÑÑом в еÑÑеÑÑвенном ÑзÑке, и ÑолÑко ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ASCII Ð¾Ñ Â«
A» до «Z» обÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº бÑквÑ. Такое поведение ÑÑÑекÑивно и ÑÑабилÑно ÑабоÑÐ°ÐµÑ Ð²Ð¾ вÑÐµÑ Ð²ÐµÑÑиÑÑ . ÐÑавило доÑÑÑпно ÑолÑко Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑовкиUTF8. (ÐÑо пÑавило ÑоÑÑиÑовки ÑабоÑÐ°ÐµÑ Ñак же, как и пÑавилоCлокали libc в кодиÑовкеUTF8.)pg_c_utf8С ÑÑим пÑавилом ÑоÑÑиÑовка вÑполнÑеÑÑÑ Ð¿Ð¾ кодам Ñимволов Unicode, а не в поÑÑдке, пÑинÑÑом в еÑÑеÑÑвенном ÑзÑке. ÐÐ»Ñ ÑÑнкÑий
lower,initcapиupperиÑполÑзÑеÑÑÑ Ð¿ÑоÑÑое пÑеобÑазование ÑегиÑÑÑа Unicode. ÐÐ»Ñ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñаблонов (вклÑÑÐ°Ñ ÑегÑлÑÑнÑе вÑÑажениÑ) иÑполÑзÑеÑÑÑ ÑовмеÑÑимÑй Ñ POSIX ваÑÐ¸Ð°Ð½Ñ Unicode (СовмеÑÑимоÑÑÑ). Такое поведение ÑÑÑекÑивно и ÑÑабилÑно в оÑновной веÑÑии Postgres Pro. Ðанное пÑавило ÑоÑÑиÑовки доÑÑÑпно ÑолÑко Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸ÑовкиUTF8.C(ÑавнознаÑноPOSIX)ÐÑавила ÑоÑÑиÑовки
CиPOSIXоÑÐ½Ð¾Ð²Ð°Ð½Ñ Ð½Ð° «ÑÑадиÑионном» поведении C. С ÑÑими пÑавилами ÑоÑÑиÑовка вÑполнÑеÑÑÑ Ð¿Ð¾ байÑовÑм знаÑениÑм, а не в поÑÑдке, пÑинÑÑом в еÑÑеÑÑвенном ÑзÑке, и ÑолÑко ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ASCII Ð¾Ñ Â«A» до «Z» обÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº бÑквÑ. Ðоведение ÑÑÑекÑивно и ÑÑабилÑно во вÑÐµÑ Ð²ÐµÑÑиÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ кодиÑовки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , но Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовок.defaultС пÑавилом ÑоÑÑиÑовки
defaultвÑбиÑаеÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð¿Ñи Ñоздании Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐоддеÑжка дополниÑелÑнÑÑ Ð¿Ñавил ÑоÑÑиÑовки завиÑÐ¸Ñ Ð¾Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑемÑ, а ÑÑÑекÑивноÑÑÑ Ð¸ ÑÑабилÑноÑÑÑ ÑÑÐ¸Ñ Ð¿Ñавил â Ð¾Ñ Ð¿ÑовайдеÑа, его веÑÑии и локали.
22.2.2.2. ÐÑедопÑеделÑннÑе пÑавила ÑоÑÑиÑовки #
ÐÑли опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸ÑполÑзование неÑколÑкиÑ
локалей в одной пÑогÑамме (newlocale и ÑвÑзаннÑе ÑÑнкÑии) или вклÑÑена поддеÑжка ICU, Ñо пÑи иниÑиализаÑии клаÑÑеÑа баз даннÑÑ
пÑогÑамма initdb наполнÑÐµÑ ÑиÑÑемнÑй каÑалог pg_collation инÑоÑмаÑией обо вÑеÑ
локалÑÑ
, коÑоÑÑе обнаÑÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð² ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð² опеÑаÑионной ÑиÑÑеме.
ÐÐ»Ñ Ð¿ÑоÑмоÑÑа вÑеÑ
имеÑÑиÑ
ÑÑ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ вÑполниÑе запÑÐ¾Ñ SELECT * FROM pg_collation или ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ \dOS+ в psql.
22.2.2.2.1. ÐÑавила ÑоÑÑиÑовки libc #
ÐапÑимеÑ, опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ru_RU.utf8 ÐÑи ÑÑом пÑогÑамма initdb ÑоздаÑÑ Ð¿Ñавило ÑоÑÑиÑовки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ru_RU.utf8 Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñовки UTF8, в коÑоÑом LC_COLLATE и LC_CTYPE бÑдÑÑ ÑÐ°Ð²Ð½Ñ ru_RU.utf8. Также бÑÐ´ÐµÑ Ñоздано пÑавило ÑоÑÑиÑовки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ без меÑки .utf8 в оконÑании. Таким обÑазом, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑÑо пÑавило под именем ru_RU, коÑоÑое бÑÐ´ÐµÑ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑнее и не бÑÐ´ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки. ÐамеÑÑÑе, ÑÑо изнаÑалÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¸Ð¼Ñн пÑавил ÑоÑÑиÑовки Ñем не менее завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð»Ð°ÑÑоÑмÑ.
СÑандаÑÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñавил ÑоÑÑиÑовки, пÑедоÑÑавлÑемÑй пÑовайдеÑом libc, ÑопоÑÑавлÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ Ð»Ð¾ÐºÐ°Ð»Ñми, ÑÑÑановленнÑми в опеÑаÑионной ÑиÑÑеме (иÑ
можно пÑоÑмоÑÑеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ locale -a). Ð ÑлÑÑаÑÑ
, когда Ñ Ð¿Ñавила ÑоÑÑиÑовки libc Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазлиÑнÑе знаÑÐµÐ½Ð¸Ñ LC_COLLATE и LC_CTYPE, или когда в опеÑаÑионнÑÑ ÑиÑÑÐµÐ¼Ñ Ð¿Ð¾Ñле иниÑиализаÑии СУÐÐ ÑÑÑанавливаÑÑÑÑ Ð½Ð¾Ð²Ñе локали, ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ пÑавило ÑоÑÑиÑовки можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE COLLATION. ÐовÑе локали опеÑаÑионной ÑиÑÑÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñакже импоÑÑиÑоваÑÑ Ð² маÑÑовом поÑÑдке, воÑполÑзовавÑиÑÑ ÑÑнкÑией pg_import_system_collations().
РлÑбой базе даннÑÑ
имеÑÑ Ð·Ð½Ð°Ñение ÑолÑко Ñе пÑавила ÑоÑÑиÑовки, коÑоÑÑе иÑполÑзÑÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ ÑÑой Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑоÑие запиÑи в pg_collation игноÑиÑÑÑÑÑÑ. Таким обÑазом, ÑÑеÑÑнное Ð¸Ð¼Ñ Ð¿Ñавил ÑоÑÑиÑовки, Ñакое как ru_RU, Ð¼Ð¾Ð¶ÐµÑ ÑÑиÑаÑÑÑÑ ÑникалÑнÑм внÑÑÑи данной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, даже еÑли Ð±Ñ Ð¾Ð½Ð¾ не бÑло ÑникалÑнÑм глобалÑно. ÐÑполÑзование ÑÑеÑÑнного имени ÑоÑÑиÑовки ÑекомендÑеÑÑÑ, Ñак как пÑи пеÑеÑ
оде на дÑÑгÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑидÑÑÑÑ Ð²ÑполниÑÑ Ð½Ð° одно изменение менÑÑе. Ðднако ÑледÑÐµÑ Ð¿Ð¾Ð¼Ð½Ð¸ÑÑ, ÑÑо пÑавила ÑоÑÑиÑовки default, C и POSIX можно иÑполÑзоваÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
Ð Postgres Pro пÑедполагаеÑÑÑ, ÑÑо оÑделÑнÑе обÑекÑÑ Ð¿Ñавил ÑоÑÑиÑовки неÑовмеÑÑимÑ, даже когда они имеÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑе ÑвойÑÑва. Так, напÑимеÑ,
SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;
вÑÐ²ÐµÐ´ÐµÑ ÑообÑение об оÑибке, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо поведение пÑавил ÑоÑÑиÑовки C и POSIX иденÑиÑно. Ðо ÑÑой пÑиÑине ÑмеÑиваÑÑ ÑÑеÑÑннÑе и полнÑе имена пÑавил ÑоÑÑиÑовки не ÑекомендÑеÑÑÑ.
22.2.2.2.2. ÐÑавила ÑоÑÑиÑовки ICU #
С ICU не пÑедÑÑавлÑеÑÑÑ ÑазÑмнÑм пеÑеÑиÑлÑÑÑ Ð²Ñе возможнÑе имена локалей. ICU иÑполÑзÑÐµÑ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ опÑеделÑннÑÑ ÑÑ
ÐµÐ¼Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ, но имÑн локалей Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð³Ð¾Ñаздо болÑÑе, Ñем ÑобÑÑвенно ÑазлиÑнÑÑ
локалей. ÐÑогÑамма initdb, иÑполÑзÑÑ API ICU, Ð¸Ð·Ð²Ð»ÐµÐºÐ°ÐµÑ ÑпиÑок ÑазлиÑнÑÑ
локалей и наполнÑÐµÑ Ð½Ð°ÑалÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñавил в базе даннÑÑ
. ÐÑавила ÑоÑÑиÑовки пÑовайдеÑа ICU ÑоздаÑÑÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, вклÑÑаÑÑими меÑÐºÑ ÑзÑка в ÑоÑмаÑе BCP 47 и Ñказание ÑаÑÑиÑÐµÐ½Ð¸Ñ Â«Ð´Ð»Ñ ÑаÑÑного иÑполÑзованиÑ» (-x-icu), Ð´Ð»Ñ Ð¾ÑлиÑÐ¸Ñ Ð¾Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ libc.
ÐапÑимеÑ, могÑÑ Ð±ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ñакие пÑавила ÑоÑÑиÑовки:
ru-x-icu#Ð ÑÑÑкое пÑавило ÑоÑÑиÑовки, ÑÑандаÑÑнÑй ваÑианÑ
ru-UA-x-icu#Ð ÑÑÑкое пÑавило ÑоÑÑиÑовки Ð´Ð»Ñ Ð£ÐºÑаинÑ, ÑÑандаÑÑнÑй ваÑианÑ
(ÐапÑимеÑ, ÑÑÑеÑÑвÑÐµÑ Ð¿Ñавило
ru-RU-x-icu, но на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð´Ð¾ÐºÑменÑаÑии оно ÑавнознаÑно пÑавилÑru-x-icu.)und-x-icu(«undefined», неопÑеделÑннаÑ) #«ÐоÑневое» пÑавило ÑоÑÑиÑовки ICU. Ðно ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑазÑмнÑй ÑзÑконезавиÑимÑй поÑÑдок ÑоÑÑиÑовки.
ÐекоÑоÑÑе (Ñедко иÑполÑзÑемÑе) кодиÑовки не поддеÑживаÑÑÑÑ ICU. Ðогда база Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð½Ñ Ð¸Ð· ÑакиÑ
кодиÑовок, запиÑи пÑавил ÑоÑÑиÑовки ICU в pg_collation игноÑиÑÑÑÑÑÑ. ÐÑи попÑÑке иÑполÑзоваÑÑ Ð¸Ñ
бÑÐ´ÐµÑ Ð²Ñдана оÑибка Ñ ÑообÑением вида «пÑавило ÑоÑÑиÑовки "de-x-icu" Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñовки "WIN874" не ÑÑÑеÑÑвÑеÑ».
22.2.2.3. Создание новÑÑ Ð¿Ñавил ÑоÑÑиÑовки #
ÐÑли ÑÑандаÑÑнÑÑ Ð¸ пÑедопÑеделÑннÑÑ Ð¿Ñавил ÑоÑÑиÑовки недоÑÑаÑоÑно, полÑзоваÑели могÑÑ ÑоздаваÑÑ ÑобÑÑвеннÑе пÑавила ÑоÑÑиÑовки, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL CREATE COLLATION.
СÑандаÑÑнÑе и пÑедопÑеделÑннÑе пÑавила ÑоÑÑиÑовки наÑ
одÑÑÑÑ Ð² ÑÑ
еме pg_catalog, как и вÑе пÑедопÑеделÑннÑе обÑекÑÑ. ÐолÑзоваÑелÑÑкие пÑавила ÑоÑÑиÑовки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоздаваÑÑÑÑ Ð² полÑзоваÑелÑÑкиÑ
ÑÑ
емаÑ
. Ðомимо пÑоÑего, ÑÑо полезно Ñем, ÑÑо иÑ
бÑÐ´ÐµÑ Ð²ÑгÑÑжаÑÑ pg_dump.
22.2.2.3.1. ÐÑавила ÑоÑÑиÑовки libc #
ÐовÑе пÑавила ÑоÑÑиÑовки libc могÑÑ ÑоздаваÑÑÑÑ Ñак:
CREATE COLLATION russian (provider = libc, locale = 'ru_RU');
ТоÑнÑе знаÑениÑ, коÑоÑÑе могÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Ð² пÑедложении locale в ÑÑой команде, завиÑÑÑ Ð¾Ñ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑемÑ. Ð Unix-подобнÑÑ
ÑиÑÑемаÑ
иÑ
ÑпиÑок вÑдаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° locale -a.
Так как пÑедопÑеделÑннÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñавил ÑоÑÑиÑовки libc Ñже вклÑÑÐ°ÐµÑ Ð²Ñе пÑавила ÑоÑÑиÑовки, опÑеделÑннÑе в опеÑаÑионной ÑиÑÑеме в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸Ð½Ð¸ÑиализаÑии Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, необÑ
одимоÑÑÑ ÑоздаваÑÑ Ð½Ð¾Ð²Ñе пÑавила вÑÑÑнÑÑ Ð¾Ð±ÑÑно не возникаеÑ. Ð¢Ð°ÐºÐ°Ñ Ð¿Ð¾ÑÑебноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ, когда нÑжно ÑмениÑÑ ÑиÑÑÐµÐ¼Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ (в ÑÑом ÑлÑÑае Ñм. ÐодÑаздел 22.2.2.3.3) либо когда опеÑаÑÐ¸Ð¾Ð½Ð½Ð°Ñ ÑиÑÑема бÑла обновлена и в ней поÑвилиÑÑ Ð½Ð¾Ð²Ñе опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ (в ÑÑом ÑлÑÑае Ñм. pg_import_system_collations()).
22.2.2.3.2. ÐÑавила ÑоÑÑиÑовки ICU #
ÐÑавила ÑоÑÑиÑовки ICU могÑÑ Ð±ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÑледÑÑÑим обÑазом:
CREATE COLLATION german (provider = icu, locale = 'de-DE');
Ðмена локалей ICU ÑказÑваÑÑÑÑ ÐºÐ°Ðº ÑзÑковÑе меÑки BCP 47, но Ñакже пÑинимаеÑÑÑ Ð±Ð¾Ð»ÑÑинÑÑво имÑн локалей в ÑÑиле libc. ÐÑли ÑÑо возможно, имена локалей в ÑÑиле libc пÑеобÑазÑÑÑÑÑ Ð² ÑзÑковÑе меÑки.
ÐÐ»Ñ Ð½Ð¾Ð²ÑÑ Ð¿Ñавил ÑоÑÑиÑовки ICU допÑÑкаеÑÑÑ Ð½Ð°ÑÑÑойка Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿ÑÑÑм ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑов в ÑзÑковой меÑке. Ðа подÑобнÑм опиÑанием и пÑимеÑами обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 22.2.3.
22.2.2.3.3. ÐопиÑование пÑавил ÑоÑÑиÑовки #
Ðоманда CREATE COLLATION Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ пÑавило ÑоÑÑиÑовки из ÑÑÑеÑÑвÑÑÑего, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼Ñн, незавиÑимÑÑ Ð¾Ñ Ð¾Ð¿ÐµÑаÑионнÑÑ ÑиÑÑем, ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼Ñн Ð´Ð»Ñ ÑовмеÑÑимоÑÑи или иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñавил ÑоÑÑиÑовки ICU под более понÑÑнÑми именами. ÐапÑимеÑ:
CREATE COLLATION russian FROM "ru_RU"; CREATE COLLATION french FROM "fr-x-icu";
22.2.2.4. ÐедеÑеÑминиÑованнÑе пÑавила ÑоÑÑиÑовки #
ÐÑавило ÑоÑÑиÑовки Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ð¸Ð±Ð¾ деÑеÑминиÑованнÑм, либо недеÑеÑминиÑованнÑм. С деÑеÑминиÑованнÑми пÑавилами ÑоÑÑиÑовки иÑполÑзÑÑÑÑÑ Ð´ÐµÑеÑминиÑованнÑе ÑÑавнениÑ, ÑÑо ознаÑаеÑ, ÑÑо ÑÑоки ÑÑиÑаÑÑÑÑ ÑавнÑми, ÑолÑко еÑли они ÑоÑÑоÑÑ Ð¸Ð· одинаковой поÑледоваÑелÑноÑÑи байÑов. ÐедеÑеÑминиÑованное же ÑÑавнение Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑизнаÑÑ ÑавнÑми ÑÑÑоки, ÑоÑÑоÑÑие и из ÑазнÑÑ Ð±Ð°Ð¹Ñов. ÐбÑÑно ÑÑо ÑÑебÑеÑÑÑ Ð¿Ñи ÑÑавнении без ÑÑÑÑа ÑегиÑÑÑа или ÑдаÑениÑ, а Ñакже пÑи ÑÑавнении ÑÑÑок в ÑазлиÑнÑÑ Ð½Ð¾ÑмалÑнÑÑ ÑоÑÐ¼Ð°Ñ Unicode. Ðак именно бÑдÑÑ ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑÑавнениÑ, опÑеделÑеÑÑÑ Ð¿ÑовайдеÑом пÑавил ÑоÑÑиÑовки; Ñлаг деÑеÑминиÑованноÑÑи ÑолÑко оÑмеÑаеÑ, бÑÐ´ÐµÑ Ð»Ð¸ вопÑÐ¾Ñ ÑавенÑÑва ÑеÑаÑÑÑÑ Ð¿Ð¾Ð±Ð°Ð¹ÑовÑм ÑÑавнением. ÐодÑобнее ÑопÑÑÑÑвÑÑÑÐ°Ñ ÑеÑÐ¼Ð¸Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð² Ð¢ÐµÑ Ð½Ð¸ÑеÑком ÑÑандаÑÑе Unicode 10.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð½ÐµÐ´ÐµÑеÑминиÑованное пÑавило ÑоÑÑиÑовки, ÑкажиÑе ÑвойÑÑво deterministic = false в команде CREATE COLLATION, напÑÐ¸Ð¼ÐµÑ Ñак:
CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);
Рданном пÑимеÑе бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑÑандаÑÑное пÑавило ÑоÑÑиÑовки Unicode в недеÑеÑминиÑованном Ñежиме. Ð ÑаÑÑноÑÑи, ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÐºÐ¾ÑÑекÑно ÑÑавниваÑÑ ÑÑÑоки в ÑазлиÑнÑÑ Ð½Ð¾ÑмалÑнÑÑ ÑоÑÐ¼Ð°Ñ . ÐÐ»Ñ Ð±Ð¾Ð»ÐµÐµ инÑеÑеÑнÑÑ Ð¿Ñименений задейÑÑвÑÑÑÑÑ ÑпеÑиалÑнÑе возможноÑÑи ICU, ÑаÑÑмоÑÑеннÑе вÑÑе. ÐапÑимеÑ:
CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false); CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);
ÐÑе ÑÑандаÑÑнÑе и пÑедопÑеделÑннÑе пÑавила ÑоÑÑиÑовки ÑвлÑÑÑÑÑ Ð´ÐµÑеÑминиÑованнÑми, и Ñак же деÑеÑминиÑованнÑми по ÑмолÑÐ°Ð½Ð¸Ñ ÑоздаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкие пÑавила. ÐедеÑеÑминиÑованнÑе пÑавила ÑоÑÑиÑовки обеÑпеÑиваÑÑ Ð±Ð¾Ð»ÐµÐµ «пÑавилÑное» поведение, оÑобенно в ÑаÑÑи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей Unicode и обÑабоÑки множеÑÑва оÑобÑÑ ÑлÑÑаев, но они имеÑÑ Ð¸ ÑÑд недоÑÑаÑков. ÐÑежде вÑего, Ð¸Ñ Ð¿Ñименение оÑÑиÑаÑелÑно ÑказÑваеÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑи. ÐамеÑÑÑе в ÑаÑÑноÑÑи, ÑÑо в B-деÑевÑÑÑ Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑм пÑавилами не бÑÐ´ÐµÑ Ð¿ÑоизводиÑÑÑÑ Ð¸ÑклÑÑение дÑбликаÑов. Ð ÑÐ¾Ð¼Ñ Ð¶Ðµ Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑми пÑавилами ÑоÑÑиÑовки Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð½ÐµÐºÐ¾ÑоÑÑе опеÑаÑии, напÑимеÑ, поиÑк по ÑаблонÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑименÑÑÑ Ð¸Ñ ÑледÑÐµÑ ÑолÑко Ñогда, когда в ÑÑом еÑÑÑ ÑÐ²Ð½Ð°Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ.
ÐодÑказка
ÐÐ»Ñ ÑÑÑекÑивной обÑабоÑки ÑекÑÑа в ÑазлиÑнÑÑ
ÑоÑмаÑ
ноÑмализаÑии Unicode Ñакже можно иÑполÑзоваÑÑ ÑÑнкÑии/вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ normalize и is normalized, позволÑÑÑие пÑедваÑиÑелÑно обÑабоÑаÑÑ Ð¸Ð»Ð¸ пÑовеÑиÑÑ ÑÑÑоки, и не пÑибегаÑÑ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑÑ
пÑавил ÑоÑÑиÑовки. Ðднако каждÑй подÑ
од Ð¸Ð¼ÐµÐµÑ Ñвои минÑÑÑ.
22.2.3. ÐолÑзоваÑелÑÑкие пÑавила ÑоÑÑиÑовки ICU #
ICU позволÑÐµÑ ÑпÑавлÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ пÑавил ÑоÑÑиÑовки пÑÑÑм опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ Ð¿Ñавил Ñ Ð¿Ð°ÑамеÑÑами, заданнÑми в виде ÑаÑÑи ÑзÑковой меÑки. ÐÑи паÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки в ÑооÑвеÑÑÑвии Ñ ÑазлиÑнÑми поÑÑебноÑÑÑми. ÐапÑимеÑ:
-- игноÑиÑоваÑÑ ÑазлиÑÐ¸Ñ Ð² диакÑиÑиÑеÑÐºÐ¸Ñ Ð·Ð½Ð°ÐºÐ°Ñ Ð¸ ÑегиÑÑÑе CREATE COLLATION ignore_accent_case (provider = icu, deterministic = false, locale = 'und-u-ks-level1'); SELECT 'à ' = 'A' COLLATE ignore_accent_case; -- true SELECT 'z' = 'Z' COLLATE ignore_accent_case; -- true -- бÑÐºÐ²Ñ Ð² веÑÑ Ð½ÐµÐ¼ ÑегиÑÑÑе идÑÑ Ð¿ÐµÑед бÑквами в нижнем CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper'); SELECT 'B' < 'b' COLLATE upper_first; -- true -- ÑоÑÑиÑоваÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑи ÑиÑÑ Ð¿Ð¾ ÑиÑловÑм знаÑениÑм и игноÑиÑоваÑÑ Ð·Ð½Ð°ÐºÐ¸ пÑнкÑÑаÑии CREATE COLLATION num_ignore_punct (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-kn'); SELECT 'id-45' < 'id-123' COLLATE num_ignore_punct; -- true SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true
Ðногие доÑÑÑпнÑе паÑамеÑÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÐодÑазделе 22.2.3.2, а дополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÐодÑазделе 22.2.3.5.
22.2.3.1. УÑовни ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ICU #
СÑавнение двÑÑ ÑÑÑок (ÑоÑÑиÑовка) в ICU опÑеделÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÑÑовневÑм пÑоÑеÑÑом, в коÑоÑом ÑекÑÑовÑе пÑизнаки ÑгÑÑппиÑÐ¾Ð²Ð°Ð½Ñ Ð² «ÑÑовни». ÐбÑабоÑка каждого ÑÑÐ¾Ð²Ð½Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ð¿Ð°ÑамеÑÑами пÑавил ÑоÑÑиÑовки. Ðа более вÑÑÐ¾ÐºÐ¸Ñ ÑÑовнÑÑ Ð²ÑполнÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ деÑалÑное ÑÑавнение.
ТаблиÑа 22.1 показÑваеÑ, какие ÑазлиÑÐ¸Ñ Ð² ÑекÑÑовÑÑ
пÑизнакаÑ
имеÑÑ Ð¿ÑиоÑиÑÐµÑ Ð¿Ñи ÑÑавнении на данном ÑÑовне. Символ Unicode U+2063 ÑвлÑеÑÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñм ÑазделиÑелем и, как видно из ÑаблиÑÑ, игноÑиÑÑеÑÑÑ Ð½Ð° вÑеÑ
ÑÑовнÑÑ
ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶Ðµ identic.
ТаблиÑа 22.1. УÑовни ÑоÑÑиÑовки ICU
| УÑÐ¾Ð²ÐµÐ½Ñ | ÐпиÑание | 'f' = 'f' | 'ab' = U&'a\2063b' | 'x-y' = 'x_y' | 'g' = 'G' | 'n' = 'ñ' | 'y' = 'z' |
|---|---|---|---|---|---|---|---|
| level1 | ÐазовÑй Ñимвол | true | true | true | true | true | false |
| level2 | ÐиакÑиÑиÑеÑкие знаки | true | true | true | true | false | false |
| level3 | РегиÑÑÑÑ/ÐаÑианÑÑ | true | true | true | false | false | false |
| level4 | ÐÑнкÑÑаÑиÑ[a] | true | true | false | false | false | false |
| identic | ÐÑе | true | false | false | false | false | false |
[a] ÑолÑко Ñ | |||||||
Ðа каждом ÑÑовне, даже пÑи вÑклÑÑенной полной ноÑмализаÑии, вÑполнÑеÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ð½Ð¾ÑмализаÑиÑ. ÐапÑимеÑ, 'á' Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· кодов Ñимволов U&'\0061\0301' или одного кода Ñимвола U&'\00E1', и ÑÑи поÑледоваÑелÑноÑÑи бÑдÑÑ ÑÑиÑаÑÑÑÑ ÑавнÑми даже на ÑÑовне identic. ЧÑÐ¾Ð±Ñ ÑÑиÑÑвалиÑÑ Ð»ÑбÑе ÑазлиÑÐ¸Ñ Ð² пÑедÑÑавлениÑÑ
кодов Ñимволов, иÑполÑзÑйÑе паÑамеÑÑÑ Ð¿Ñавил ÑоÑÑиÑовки, ÑозданнÑе Ñ Ð¿Ð°ÑамеÑÑом deterministic, коÑоÑÑй Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true.
22.2.3.1.1. ÐÑимеÑÑ ÑÑовней ÑоÑÑиÑовки #
CREATE COLLATION level3 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level3'); CREATE COLLATION level4 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level4'); CREATE COLLATION identic (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-identic'); -- невидимÑй ÑазделиÑелÑ, игноÑиÑÑемÑй на вÑÐµÑ ÑÑовнÑÑ ÐºÑоме identic SELECT 'ab' = U&'a\2063b' COLLATE level4; -- true SELECT 'ab' = U&'a\2063b' COLLATE identic; -- false -- знаки пÑнкÑÑаÑии игноÑиÑÑÑÑÑÑ Ð½Ð° ÑÑовне 3, но не на ÑÑовне 4 SELECT 'x-y' = 'x_y' COLLATE level3; -- true SELECT 'x-y' = 'x_y' COLLATE level4; -- false
22.2.3.2. ÐаÑамеÑÑÑ Ð¿Ñавил ÑоÑÑиÑовки Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU #
ТаблиÑа 22.2 показÑÐ²Ð°ÐµÑ Ð´Ð¾ÑÑÑпнÑе паÑамеÑÑÑ Ð¿Ñавил ÑоÑÑиÑовки, коÑоÑÑе можно иÑполÑзоваÑÑ ÐºÐ°Ðº ÑаÑÑÑ ÑзÑковой меÑки Ð´Ð»Ñ Ð½Ð°ÑÑÑойки пÑавил ÑоÑÑиÑовки.
ТаблиÑа 22.2. ÐаÑамеÑÑ Ð¿Ñавил ÑоÑÑиÑовки ICU
| ÐлÑÑ | ÐнаÑÐµÐ½Ð¸Ñ | Ðо ÑмолÑÐ°Ð½Ð¸Ñ | ÐпиÑание |
|---|---|---|---|
co | emoji, phonebk, standard, ... | standard | Тип пÑавил ÑоÑÑиÑовки. ÐбÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 22.2.3.5 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии. |
ka | noignore, shifted | noignore | ÐÑли ÑÑÑановлено знаÑение shifted, некоÑоÑÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ (напÑимеÑ, знаки пÑÐµÐ¿Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ пÑобел) игноÑиÑÑÑÑÑÑ Ð¿Ñи ÑÑавнении. ЧÑÐ¾Ð±Ñ ÐºÐ»ÑÑ ks пÑименÑлÑÑ, он должен бÑÑÑ ÑÑÑановлен на ÑÑовне level3 или ниже. УÑÑановиÑе клÑÑ kv, ÑÑÐ¾Ð±Ñ ÑказаÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑемÑе клаÑÑÑ Ñимволов. |
kb | true, false | false | ÐбÑаÑное ÑÑавнение Ð´Ð»Ñ ÑазлиÑий ÑÑÐ¾Ð²Ð½Ñ 2. ÐапÑимеÑ, Ñ Ð»Ð¾ÐºÐ°Ð»ÑÑ und-u-kb 'à e' окажеÑÑÑ Ð¿ÐµÑед 'aé'. |
kc | true, false | false | ÐÑноÑÐ¸Ñ ÑлÑÑай к «ÑÑÐ¾Ð²Ð½Ñ 2.5», коÑоÑÑй Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð¸Ð°ÐºÑиÑиÑеÑкими знаками и дÑÑгими пÑизнаками ÑÑÐ¾Ð²Ð½Ñ 3. ÐÑли ÑÑÑановлено знаÑение |
kf | upper, lower, false | false | ÐÑли ÑÑÑановлено знаÑение upper, ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² веÑÑ
нем ÑегиÑÑÑе идÑÑ Ð¿ÐµÑед Ñимволами в нижнем, а еÑли lower â наобоÑоÑ. ÐÑли ÑÑÑановлено знаÑение false, ÑоÑÑиÑовка завиÑÐ¸Ñ Ð¾Ñ Ð¿Ñавил локали. |
kn | true, false | false | ÐÑли ÑÑÑановлено знаÑение true, поÑледоваÑелÑноÑÑи ÑиÑÑ ÑоÑÑиÑÑÑÑÑÑ Ð¿Ð¾ ÑиÑловÑм знаÑениÑм. ÐапÑимеÑ, 'id-45' окажеÑÑÑ Ð¿ÐµÑед 'id-123'. |
kk | true, false | false | ÐклÑÑÐ°ÐµÑ Ð¿Ð¾Ð»Ð½ÑÑ Ð½Ð¾ÑмализаÑиÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ. ÐÐ°Ð·Ð¾Ð²Ð°Ñ Ð½Ð¾ÑмализаÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ, даже еÑли ÑÑÑановлено знаÑение РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
важна Ð¿Ð¾Ð»Ð½Ð°Ñ Ð½Ð¾ÑмализаÑиÑ, напÑимеÑ, когда к Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÑименÑеÑÑÑ Ð½ÐµÑколÑко диакÑиÑиÑеÑкиÑ
знаков. ÐапÑимеÑ, поÑледоваÑелÑноÑÑи кодов Ñимволов |
kr | space, punct, symbol, currency, digit, id_ÑкÑипÑа |  | ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð½Ð¾ или неÑколÑко допÑÑÑимÑÑ
знаÑений или лÑбой ÐеÑеопÑеделÑÐµÑ ÑпоÑÑдоÑение клаÑÑов Ñимволов: ÑимволÑ, пÑинадлежаÑие более ÑÐ°Ð½Ð½ÐµÐ¼Ñ ÐºÐ»Ð°ÑÑÑ Ð² ÑпиÑке, ÑказÑваÑÑÑÑ Ð¿ÐµÑед Ñимволами, пÑинадлежаÑими более Ð¿Ð¾Ð·Ð´Ð½ÐµÐ¼Ñ ÐºÐ»Ð°ÑÑÑ Ð² ÑпиÑке. ÐапÑимеÑ, знаÑение |
ks | level1, level2, level3, level4, identic | level3 | ЧÑвÑÑвиÑелÑноÑÑÑ (или «ÑÑепенÑ») пÑи ÑÑавнении, где на ÑÑовне на ÑÑовне identic болÑÑинÑÑво ÑазлиÑий ÑÑиÑÑваеÑÑÑ, а на ÑÑовне level1 â игноÑиÑÑеÑÑÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ТаблиÑе 22.1. |
kv | space, punct, symbol, currency | punct | ÐлаÑÑÑ Ñимволов игноÑиÑÑÑÑÑÑ Ð¿Ñи ÑÑавнении на ÑÑовне 3. УÑÑановка ÑледÑÑÑего знаÑÐµÐ½Ð¸Ñ Ð² ÑпиÑке вклÑÑÐ°ÐµÑ Ð²Ñе пÑедÑдÑÑие, напÑÐ¸Ð¼ÐµÑ symbol Ñакже вклÑÑÐ°ÐµÑ punct и space в ÑимволаÑ
, коÑоÑÑе ÑледÑÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ. ЧÑÐ¾Ð±Ñ ÑабоÑаÑÑ, клÑÑ ka должен имеÑÑ Ð·Ð½Ð°Ñение shifted, а клÑÑ ks â знаÑение level3 или ниже. |
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸. ÐÑиведÑÐ½Ð½Ð°Ñ Ð²ÑÑе ÑаблиÑа не ÑвлÑеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¹. ÐбÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 22.2.3.5 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии.
ÐÑимеÑание
Ð ÑлÑÑае Ñо многими паÑамеÑÑами пÑавил ÑоÑÑиÑовки, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÐºÑеÑнÑй паÑамеÑÑ Ð¸Ð¼ÐµÐ» желаемÑй ÑÑÑекÑ, нÑжно ÑоздаваÑÑ Ð¿Ñавила ÑоÑÑиÑовки Ñ Ð¿Ð°ÑамеÑÑом deterministic, Ð´Ð»Ñ ÐºÐ¾ÑоÑого задано знаÑение false (Ñм. ÐодÑаздел 22.2.2.4). ÐÑоме Ñого, некоÑоÑÑе паÑамеÑÑÑ Ð²ÑÑÑпаÑÑ Ð² ÑÐ¸Ð»Ñ ÑолÑко Ñогда, когда Ð´Ð»Ñ ÐºÐ»ÑÑа ka ÑÑÑановлено знаÑение shifted (Ñм. ТаблиÑÑ 22.2).
22.2.3.3. ÐÑимеÑÑ Ð¿Ð°ÑамеÑÑов пÑавил ÑоÑÑиÑовки #
CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk');#ÐемеÑкое пÑавило ÑоÑÑиÑовки Ñ Ð¿Ð¾ÑÑдком, пÑинÑÑÑм Ð´Ð»Ñ ÑелеÑонной книги
CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji');#ÐоÑневое пÑавило Ñ ÑоÑÑиÑовкой Ñмодзи, ÑооÑвеÑÑÑвÑÑÑее ÑÐµÑ Ð½Ð¸ÑеÑÐºÐ¾Ð¼Ñ ÑÑандаÑÑÑ Unicode â51
CREATE COLLATION latn_cyrl (provider = icu, locale = 'ru-RU-u-kr-latn-cyrl');#ÐÑавило ÑоÑÑиÑовки, Ñ ÐºÐ¾ÑоÑÑм лаÑинÑкие бÑÐºÐ²Ñ Ð¸Ð´ÑÑ Ð¿ÐµÑед бÑквами киÑиллиÑÑ. (Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑнаÑала идÑÑ Ð±ÑÐºÐ²Ñ ÐºÐ¸ÑиллиÑÑ.)
CREATE COLLATION upperfirst (provider = icu, locale = 'ru-RU-u-kf-upper');#ÐÑавило ÑоÑÑиÑовки, Ñ ÐºÐ¾ÑоÑÑм бÑÐºÐ²Ñ Ð² веÑÑ Ð½ÐµÐ¼ ÑегиÑÑÑе идÑÑ Ð¿ÐµÑед бÑквами в нижнем. (Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑнаÑала идÑÑ Ð±ÑÐºÐ²Ñ Ð² нижнем ÑегиÑÑÑе.)
CREATE COLLATION special (provider = icu, locale = 'ru-RU-u-kf-upper-kr-latn-cyrl');#ÐÑавило, в коÑоÑом ÑоÑеÑаÑÑÑÑ Ð¿ÑедÑдÑÑие ÑвойÑÑва.
22.2.3.4. ÐÑавила Ð´Ð»Ñ ÑоÑÑиÑовки ICU #
ÐÑли вÑÑеÑказаннÑÑ Ð¿Ð°ÑамеÑÑов пÑавил ÑоÑÑиÑовки недоÑÑаÑоÑно, поÑÑдок ÑлеменÑов ÑоÑÑиÑовки можно измениÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾ÑобÑÑ Ð¿Ñавил ÑоÑÑиÑовки, ÑинÑакÑÐ¸Ñ ÐºÐ¾ÑоÑÑÑ Ð¿Ð¾Ð´Ñобно опиÑан в https://unicode-org.github.io/icu/userguide/collation/customization/.
Ð ÑÑом пÑоÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ð¿Ñавило ÑоÑÑиÑовки на оÑнове коÑневой локали Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм ÑÑловием ÑоÑÑиÑовки:
CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');
Так бÑква «W» окажеÑÑÑ Ð¿Ð¾Ñле «V», но ÑÑо ÑÑловие ÑаÑÑмаÑÑиваеÑÑÑ ÐºÐ°Ðº вÑоÑоÑÑепенное оÑлиÑие, подобное диакÑиÑиÑеÑÐºÐ¾Ð¼Ñ Ð·Ð½Ð°ÐºÑ. Такие пÑавила ÑодеÑжаÑÑÑ Ð² опÑеделениÑÑ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ некоÑоÑÑÑ ÑзÑков. (ÐонеÑно, еÑли опÑеделение локали Ñже ÑодеÑÐ¶Ð¸Ñ Ð½ÑжнÑе пÑавила, Ð¸Ñ Ð½Ðµ нÑжно Ñнова ÑказÑваÑÑ Ñвно.)
Ðиже показан более ÑложнÑй пÑимеÑ. СледÑÑÑий опеÑаÑÐ¾Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¿Ñавило ÑоÑÑиÑовки Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ebcdic, пÑи иÑполÑзовании коÑоÑого ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ US-ASCII ÑоÑÑиÑÑÑÑÑÑ Ð² поÑÑдке, ÑооÑвеÑÑÑвÑÑÑем кодиÑовке EBCDIC.
CREATE COLLATION ebcdic (provider = icu, locale = 'und',
rules = $$
& ' ' < '.' < '<' < '(' < '+' < \|
< '&' < '!' < '$' < '*' < ')' < ';'
< '-' < '/' < ',' < '%' < '_' < '>' < '?'
< '`' < ':' < '#' < '@' < \' < '=' < '"'
<*a-r < '~' <*s-z < '^' < '[' < ']'
< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9
$$);
SELECT c
FROM (VALUES ('a'), ('b'), ('A'), ('B'), ('1'), ('2'), ('!'), ('^')) AS x(c)
ORDER BY c COLLATE ebcdic;
c
---
!
a
b
^
A
B
1
222.2.3.5. СÑÑлки на внеÑние ÑеÑÑÑÑÑ Ð¿Ñо ICU #
ÐÑÐ¾Ñ Ñаздел (ÐодÑаздел 22.2.3) пÑедÑÑавлÑÐµÑ Ñобой лиÑÑ ÐºÑаÑкий Ð¾Ð±Ð·Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ICU и ÑзÑковÑÑ Ð¼ÐµÑок. Ð¢ÐµÑ Ð½Ð¸ÑеÑкие подÑобноÑÑи, дополниÑелÑнÑе паÑамеÑÑÑ Ð¸ новое поведение опиÑÐ°Ð½Ñ Ð² ÑледÑÑÑÐ¸Ñ Ð´Ð¾ÐºÑменÑÐ°Ñ :