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. СÑандаÑÑнÑе пÑавила ÑоÑÑиÑовки
Ðа вÑеÑ
плаÑÑоÑмаÑ
доÑÑÑÐ¿Ð½Ñ Ð¿Ñавила ÑоÑÑиÑовки под названием default, C, и POSIX. ÐополниÑелÑнÑе пÑавила ÑоÑÑиÑовки могÑÑ Ð±ÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки опеÑаÑионной ÑиÑÑемÑ. ÐÑавило ÑоÑÑиÑовки default иÑполÑзÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ LC_COLLATE и LC_CTYPE, заданнÑе пÑи Ñоздании Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑавила ÑоÑÑиÑовки C и POSIX опÑеделÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ, Ñ
аÑакÑеÑное Ð´Ð»Ñ Â«ÑÑадиÑионного C», в коÑоÑом ÑолÑко знаки кодиÑовки ASCII Ð¾Ñ Â«A» до «Z» ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº бÑквÑ, и ÑоÑÑиÑовка оÑÑÑеÑÑвлÑеÑÑÑ ÑÑÑого по ÑимволÑÐ½Ð¾Ð¼Ñ ÐºÐ¾Ð´Ñ Ð±Ð°Ð¹Ñов.
ÐÐ»Ñ ÐºÐ¾Ð´Ð¸Ñовки UTF8 дополниÑелÑно поддеÑживаеÑÑÑ Ð¸Ð¼Ñ ucs_basic, опÑеделÑнное в ÑÑандаÑÑе SQL. ÐÑо пÑавило ÑоÑÑиÑовки ÑавнознаÑно пÑÐ°Ð²Ð¸Ð»Ñ C и пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ð¿Ð¾ кодам Ñимволов Unicode.
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 допÑÑÐºÐ°ÐµÑ Ð²Ð¸Ð´Ð¾Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñавил ÑоÑÑиÑовки, не огÑаниÑÐ¸Ð²Ð°Ñ Ð¿Ð¾Ð»ÑзоваÑелей набоÑами ÑзÑк+ÑÑÑана, коÑоÑÑе подгоÑÐ°Ð²Ð»Ð¸Ð²Ð°ÐµÑ initdb. ÐолÑзоваÑели могÑÑ Ñвободно ÑоздаваÑÑ ÑобÑÑвеннÑе обÑекÑÑ-пÑавила ÑоÑÑиÑовки, иÑполÑзÑÑÑие пÑедоÑÑавлÑемÑе ÑÑедÑÑва Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑебÑемÑÑ
поÑÑдков ÑоÑÑиÑовки. ÐнÑоÑмаÑÐ¸Ñ Ð¾Ð± именовании локалей ICU можно найÑи на ÑÑÑаниÑаÑ
https://unicode-org.github.io/icu/userguide/locale/ и https://unicode-org.github.io/icu/userguide/collation/api.html. ÐÐ°Ð±Ð¾Ñ Ð´Ð¾Ð¿ÑÑÑимÑÑ
имÑн и аÑÑибÑÑов завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной веÑÑии ICU.
ÐеÑколÑко пÑимеÑов:
CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk');CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de@collation=phonebook');ÐемеÑкое пÑавило ÑоÑÑиÑовки Ñ Ð¿Ð¾ÑÑдком, пÑинÑÑÑм Ð´Ð»Ñ ÑелеÑонной книги
РпеÑвом пÑимеÑе Ð»Ð¾ÐºÐ°Ð»Ñ ICU вÑбиÑаеÑÑÑ Ð¿Ð¾ «меÑке ÑзÑка» в ÑоÑмаÑе BCP 47. Ðо вÑоÑом пÑимеÑе иÑполÑзÑеÑÑÑ ÑÑадиÑионнÑй пÑинÑÑÑй в ICU ÑинÑакÑÐ¸Ñ Ð¸Ð¼ÐµÐ½Ð¸. ÐеÑвÑй ваÑÐ¸Ð°Ð½Ñ ÑвлÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ пÑедпоÑÑиÑелÑнÑм в пеÑÑпекÑиве, но он не поддеÑживаеÑÑÑ ÑÑаÑÑми веÑÑиÑми ICU.
ÐамеÑÑÑе, ÑÑо обÑекÑÑ-пÑавила ÑоÑÑиÑовки в ÑÑеде SQL Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе назÑваÑÑ ÐºÐ°Ðº Ñгодно. Ð ÑÑом пÑимеÑе Ð¼Ñ ÑледÑем ÑÑÐ¸Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð¿ÑедопÑеделÑннÑми пÑавилами, коÑоÑÑе в ÑÐ²Ð¾Ñ Ð¾ÑеÑÐµÐ´Ñ ÑледÑÑÑ BCP 47, но ÑÑо не ÑÑебÑеÑÑÑ Ð´Ð»Ñ Ð¿Ñавил ÑоÑÑиÑовки, опÑеделÑемÑÑ Ð¿Ð¾Ð»ÑзоваÑелем.
CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji');CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = '@collation=emoji');ÐоÑневое пÑавило Ñ ÑоÑÑиÑовкой Ñмодзи, ÑооÑвеÑÑÑвÑÑÑее ÑÐµÑ Ð½Ð¸ÑеÑÐºÐ¾Ð¼Ñ ÑÑандаÑÑÑ Unicode â51
ÐамеÑÑÑе, ÑÑо в ÑÑадиÑионной ÑиÑÑеме Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÐµÐ¹ ICU коÑÐ½ÐµÐ²Ð°Ñ Ð»Ð¾ÐºÐ°Ð»Ñ Ð²ÑбиÑаеÑÑÑ Ð¿ÑÑÑой ÑÑÑокой.
CREATE COLLATION latn_cyrl (provider = icu, locale = 'ru-RU-u-kr-latn-cyrl');CREATE COLLATION latn_cyrl (provider = icu, locale = 'ru@colReorder=latn-cyrl');ÐÑавило ÑоÑÑиÑовки, Ñ ÐºÐ¾ÑоÑÑм лаÑинÑкие бÑÐºÐ²Ñ Ð¸Ð´ÑÑ Ð¿ÐµÑед бÑквами киÑиллиÑÑ. (Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑнаÑала идÑÑ Ð±ÑÐºÐ²Ñ ÐºÐ¸ÑиллиÑÑ.)
CREATE COLLATION upperfirst (provider = icu, locale = 'ru-RU-u-kf-upper');CREATE COLLATION upperfirst (provider = icu, locale = 'ru@colCaseFirst=upper');ÐÑавило ÑоÑÑиÑовки, Ñ ÐºÐ¾ÑоÑÑм бÑÐºÐ²Ñ Ð² веÑÑ Ð½ÐµÐ¼ ÑегиÑÑÑе идÑÑ Ð¿ÐµÑед бÑквами в нижнем. (Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑнаÑала идÑÑ Ð±ÑÐºÐ²Ñ Ð² нижнем ÑегиÑÑÑе.)
CREATE COLLATION special (provider = icu, locale = 'ru-RU-u-kf-upper-kr-latn-cyrl');CREATE COLLATION special (provider = icu, locale = 'ru@colCaseFirst=upper;colReorder=latn-cyrl');ÐÑавило, в коÑоÑом ÑоÑеÑаÑÑÑÑ Ð¿ÑедÑдÑÑие ÑвойÑÑва.
CREATE COLLATION numeric (provider = icu, locale = 'en-u-kn-true');CREATE COLLATION numeric (provider = icu, locale = 'en@colNumeric=yes');ЧиÑÐ»Ð¾Ð²Ð°Ñ ÑоÑÑиÑовка, Ñ ÐºÐ¾ÑоÑой поÑледоваÑелÑноÑÑи ÑиÑел ÑпоÑÑдоÑиваÑÑÑÑ Ð¿Ð¾ ÑиÑÐ»Ð¾Ð²Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ, напÑимеÑ:
A-21<A-123(Ñакже назÑваеÑÑÑ ÐµÑÑеÑÑвенной ÑоÑÑиÑовкой).
Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ Ð¢ÐµÑ
ниÑеÑкого ÑÑандаÑÑа Unicode â35 и BCP 47. СпиÑок возможнÑÑ
Ñипов ÑоÑÑиÑовки (внÑÑÑеннÑÑ Ð¼ÐµÑка co) можно найÑи в ÑепозиÑоÑии CLDR.
ÐамеÑÑÑе, ÑÑо Ñ
оÑÑ Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑÑема позволÑÐµÑ ÑоздаваÑÑ Ð¿Ñавила ÑоÑÑиÑовки, коÑоÑÑе «игноÑиÑÑÑÑ ÑегиÑÑÑ» или «игноÑиÑÑÑÑ ÑдаÑениÑ» и ÑÐ¾Ð¼Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾Ðµ (иÑполÑзÑÑ ÐºÐ»ÑÑ ks), ÑÑÐ¾Ð±Ñ Ñакие пÑавила дейÑÑвиÑелÑно коÑÑекÑно игноÑиÑовали ÑÑи аÑпекÑÑ, они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑÑвлÑÑÑÑÑ Ð² CREATE COLLATION как не деÑеÑминиÑованнÑе; Ñм. ÐодÑаздел 22.2.2.4. РпÑоÑивном ÑлÑÑае ÑÑÑоки, коÑоÑÑе ÑÑиÑаÑÑÑÑ ÑавнÑми ÑоглаÑно пÑÐ°Ð²Ð¸Ð»Ñ ÑоÑÑиÑовки, но не ÑÐ°Ð²Ð½Ñ Ð¿Ð¾Ð±Ð°Ð¹Ñово, бÑдÑÑ ÑоÑÑиÑоваÑÑÑÑ Ð¿Ð¾ Ñвоим байÑовÑм знаÑениÑм.
ÐÑимеÑание
ICU по пÑиÑоде Ñвоей пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве имени локали пÑакÑиÑеÑкÑÑ Ð»ÑбÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ ÑопоÑÑавлÑÐµÑ ÐµÑ Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑей локалÑÑ, коÑоÑÑÑ Ð¾Ð½Ð° Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ, ÑледÑÑ Ð¿ÑоÑедÑÑе вÑбоÑа, опиÑанной в ÐµÑ Ð´Ð¾ÐºÑменÑаÑии. Таким обÑазом, еÑли Ñказание пÑавила ÑоÑÑиÑовки бÑÐ´ÐµÑ ÑоÑÑавлено Ñ Ð¸ÑполÑзованием Ñ Ð°ÑакÑеÑиÑÑик, коÑоÑÑе Ð´Ð°Ð½Ð½Ð°Ñ Ð¸Ð½ÑÑаллÑÑÐ¸Ñ ICU на Ñамом деле не поддеÑживаеÑ, непоÑÑедÑÑвенно ÑзнаÑÑ Ð¾Ð± ÑÑом нелÑзÑ. ÐоÑÑомÑ, ÑÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñавил ÑоÑÑиÑовки ÑооÑвеÑÑÑвÑÐµÑ ÑÑебованиÑм, ÑекомендÑеÑÑÑ Ð¿ÑовеÑÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ пÑавил на ÑÑовне пÑиложениÑ.
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, позволÑÑÑие пÑедваÑиÑелÑно обÑабоÑаÑÑ Ð¸Ð»Ð¸ пÑовеÑиÑÑ ÑÑÑоки, и не пÑибегаÑÑ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑÑ
пÑавил ÑоÑÑиÑовки. Ðднако каждÑй подÑ
од Ð¸Ð¼ÐµÐµÑ Ñвои минÑÑÑ.