F.12. citext â Ñип даннÑÑ Ð´Ð»Ñ ÑÑÑок, неÑÑвÑÑвиÑелÑнÑÑ Ðº ÑегиÑÑÑÑ #
ÐодÑÐ»Ñ citext пÑедоÑÑавлÑÐµÑ Ñип даннÑÑ
Ð´Ð»Ñ ÑÑÑок, неÑÑвÑÑвиÑелÑнÑÑ
к ÑегиÑÑÑÑ, citext. Ðо ÑÑÑи он ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð·Ð½Ð°ÑениÑ, вÑзÑÐ²Ð°Ñ Ð²Ð½ÑÑÑи ÑÐµÐ±Ñ ÑÑнкÑÐ¸Ñ lower. РоÑÑалÑном он поÑÑи не оÑлиÑаеÑÑÑ Ð¾Ñ Ñипа text.
ÐодÑказка
ÐмеÑÑо ÑÑого модÑÐ»Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл иÑполÑзоваÑÑ Ð½ÐµÐ´ÐµÑеÑминиÑованнÑе пÑавила ÑоÑÑиÑовки (Ñм. ÐодÑаздел 22.2.2.4). Ðни позволÑÑÑ Ð¾ÑÑÑеÑÑвлÑÑÑ ÑÑавнение без ÑÑÑÑа ÑегиÑÑÑа, без ÑÑÑÑа ÑдаÑÐµÐ½Ð¸Ñ Ð¸ дÑÑгие ваÑианÑÑ ÑÑавнений, пÑи ÑÑом более коÑÑекÑно обÑабаÑÑÐ²Ð°Ñ Ð¾ÑобÑе ÑлÑÑаи Unicode.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.12.1. ÐбоÑнование #
СÑандаÑÑнÑй ÑпоÑоб вÑполниÑÑ ÑÑавнение ÑÑÑок без ÑÑÑÑа ÑегиÑÑÑа в Postgres Pro заклÑÑаеÑÑÑ Ð² иÑполÑзовании ÑÑнкÑии lower пÑи ÑÑавнении знаÑений, напÑимеÑ
SELECT * FROM tab WHERE lower(col) = LOWER(?);
ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ ÑабоÑÐ°ÐµÑ Ð´Ð¾Ð²Ð¾Ð»Ñно Ñ Ð¾ÑоÑо, но Ð¸Ð¼ÐµÐµÑ ÑÑд недоÑÑаÑков:
ÐпеÑаÑоÑÑ SQL ÑÑановÑÑÑÑ Ð³Ñомоздкими, и нÑжно не забÑваÑÑ Ð²Ñегда обÑабаÑÑваÑÑ ÑÑнкÑией
lowerи ÑÑолбеÑ, и знаÑение.ÐÐ½Ð´ÐµÐºÑ Ð½Ðµ бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, еÑли ÑолÑко дополниÑелÑно не ÑоздаÑÑ ÑÑнкÑионалÑнÑй Ð¸Ð½Ð´ÐµÐºÑ Ñ ÑÑнкÑией
lower.ÐÑли Ð²Ñ Ð¾Ð±ÑÑвлÑеÑе ÑÑÐ¾Ð»Ð±ÐµÑ ÐºÐ°Ðº
UNIQUEилиPRIMARY KEY, неÑвно ÑоздаваемÑй Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ ÑÑвÑÑвиÑелÑнÑм к ÑегиÑÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½ беÑполезен Ð´Ð»Ñ ÑегиÑÑÑонезавиÑимого поиÑка, Ñак же как он не бÑÐ´ÐµÑ Ð¾Ð±ÐµÑпеÑиваÑÑ ÑникалÑноÑÑÑ Ð±ÐµÐ· ÑÑÑÑа ÑегиÑÑÑа.
Тип даннÑÑ
citext позволÑÐµÑ Ð¸ÑклÑÑиÑÑ Ð²ÑÐ·Ð¾Ð²Ñ lower в SQL-запÑоÑаÑ
и позволÑÐµÑ ÑделаÑÑ Ð¿ÐµÑвиÑнÑй клÑÑ ÑегиÑÑÑонезавиÑимÑм. Тип citext ÑÑиÑÑÐ²Ð°ÐµÑ Ð»Ð¾ÐºÐ°Ð»Ñ, Ñак же, как и Ñип text, ÑÑо ознаÑаеÑ, ÑÑо ÑÑавнение Ñимволов в веÑÑ
нем и нижнем ÑегиÑÑÑе завиÑÐ¸Ñ Ð¾Ñ Ð¿Ñавил LC_CTYPE Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑо поведение, опÑÑÑ Ð¶Ðµ, не оÑлиÑаеÑÑÑ Ð¾Ñ Ð²Ñзовов lower в запÑоÑаÑ
. Ðо Ñак как оно ÑеализÑеÑÑÑ Ð¿ÑозÑаÑно Ñипом даннÑÑ
, в ÑамиÑ
запÑоÑаÑ
дополниÑелÑно не нÑжно ниÑего делаÑÑ.
F.12.2. Ðак его иÑполÑзоваÑÑ #
ÐÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ:
CREATE TABLE users (
nick CITEXT PRIMARY KEY,
pass TEXT NOT NULL
);
INSERT INTO users VALUES ( 'larry', sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Tom', sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Damian', sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'NEAL', sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Bjørn', sha256(random()::text::bytea) );
SELECT * FROM users WHERE nick = 'Larry'; ÐпеÑаÑÐ¾Ñ SELECT веÑнÑÑ Ð¾Ð´Ð¸Ð½ коÑÑеж, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо в ÑÑÐ¾Ð»Ð±ÐµÑ nick запиÑано знаÑение larry, а в запÑоÑе ÑигÑÑиÑÑÐµÑ Larry.
F.12.3. Ðоведение пÑи ÑÑавнении ÑÑÑок #
ÐодÑÐ»Ñ citext вÑполнÑÐµÑ ÑÑавнениÑ, пÑÐ¸Ð²Ð¾Ð´Ñ ÐºÐ°Ð¶Ð´ÑÑ ÑÑÑÐ¾ÐºÑ Ðº Ð½Ð¸Ð¶Ð½ÐµÐ¼Ñ ÑегиÑÑÑÑ (как еÑли Ð±Ñ Ð²ÑзÑвалаÑÑ ÑÑнкÑÐ¸Ñ lower) и заÑем пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ðº обÑÑно. Так, напÑимеÑ, две ÑÑÑоки бÑдÑÑ ÑÑиÑаÑÑÑÑ ÑавнÑми, еÑли ÑÑнкÑÐ¸Ñ lower, обÑабоÑав иÑ
, вÑдаÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе ÑезÑлÑÑаÑÑ.
ЧÑÐ¾Ð±Ñ Ð¸Ð¼Ð¸ÑиÑоваÑÑ Ð¿Ñавило ÑоÑÑиÑовки без ÑÑÑÑа ÑегиÑÑÑа в макÑималÑно возможной ÑÑепени, ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¿ÑедоÑÑавлÑÐµÑ ÑпеÑиалÑнÑе, оÑиенÑиÑованнÑе на citext, опеÑаÑоÑÑ Ð¸ ÑÑнкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÑÑоки. Так, напÑимеÑ, опеÑаÑоÑÑ ÑегÑлÑÑнÑÑ
вÑÑажений ~ и ~* дейÑÑвÑÑÑ Ð² Ñом же клÑÑе, когда пÑименÑÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ citext: оба они не ÑÑиÑÑваÑÑ ÑегиÑÑÑ. ÐÑо же ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° опеÑаÑоÑÑ !~ и !~*, а Ñакже опеÑаÑоÑÑ LIKE ~~, ~~*, !~~ и !~~*. ÐÑли же Ð²Ñ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ ÑÑи опеÑаÑоÑÑ ÑÑиÑÑвали ÑегиÑÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑивеÑÑи иÑ
аÑгÑменÑÑ Ðº ÑÐ¸Ð¿Ñ text.
ÐодобнÑм обÑазом, вÑе ÑледÑÑÑие ÑÑнкÑии вÑполнÑÑÑ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÐµÐ· ÑÑÑÑа ÑегиÑÑÑа, еÑли иÑ
аÑгÑменÑÑ Ð¸Ð¼ÐµÑÑ Ñип citext:
regexp_match()regexp_matches()regexp_replace()regexp_split_to_array()regexp_split_to_table()replace()split_part()strpos()translate()
ÐÐ»Ñ ÑÑнкÑий Ñ ÑегÑлÑÑнÑми вÑÑажениÑми, еÑли вам нÑжно ÑегиÑÑÑозавиÑимое ÑопоÑÑавление, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавиÑÑ Ñлаг «c», ÑÑÐ¾Ð±Ñ Ð¿ÑинÑдиÑелÑно вклÑÑиÑÑ ÑÑÐ¾Ñ Ñежим. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑегиÑÑÑозавиÑимое поведение без ÑÑого Ñлага, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑивеÑÑи аÑгÑÐ¼ÐµÐ½Ñ Ðº ÑÐ¸Ð¿Ñ text, пÑежде Ñем вÑзÑваÑÑ ÑÑÑ ÑÑнкÑиÑ.
F.12.4. ÐгÑаниÑÐµÐ½Ð¸Ñ #
Смена ÑегиÑÑÑа Ñимволов в
citextзавиÑÐ¸Ñ Ð¾Ñ Ð¿Ð°ÑамеÑÑаLC_CTYPEваÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Таким обÑазом, как бÑдÑÑ ÑÑавниваÑÑÑÑ Ð·Ð½Ð°ÑениÑ, опÑеделÑеÑÑÑ Ð¿Ñи Ñоздании Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . Ðа Ñамом деле, по опÑеделениÑм ÑÑандаÑÑа Unicode, ÑÑо ÑÑавнение не бÑÐ´ÐµÑ Ð¸ÑÑинно ÑегиÑÑÑонезавиÑимÑм. Ðо ÑÑÑи ÑÑо ознаÑаеÑ, ÑÑо еÑли Ð²Ð°Ñ ÑÑÑÑÐ°Ð¸Ð²Ð°ÐµÑ ÑÑÑановленное пÑавило ÑоÑÑиÑовки, Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑÑаиваÑÑ Ð¸ ÑÑавнениÑcitext. Ðо еÑли в ваÑей базе даннÑÑ Ñ ÑанÑÑÑÑ ÑÑÑоки на ÑазнÑÑ ÑзÑÐºÐ°Ñ , полÑзоваÑели одного ÑзÑка могÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑезÑлÑÑаÑÑ Ð·Ð°Ð¿ÑоÑов, еÑли пÑавило ÑоÑÑиÑовки пÑедназнаÑено Ð´Ð»Ñ Ð´ÑÑгого ÑзÑка.ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL веÑÑии 9.1, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавлÑÑÑ Ñказание
COLLATEк знаÑениÑм даннÑÑ Ð¸Ð»Ð¸ ÑÑолбÑамcitext. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿ÐµÑаÑоÑÑcitextпÑинимаÑÑ Ð²Ð¾ внимание Ñакое Ñвное ÑказаниеCOLLATE, ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°Ñ ÑÑÑоки в нижнем ÑегиÑÑÑе, но изнаÑалÑное пÑиведение в нижний ÑегиÑÑÑ Ð²Ñегда вÑполнÑеÑÑÑ ÑоглаÑно паÑамеÑÑÑLC_CTYPEÐ±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (как еÑли Ð±Ñ ÑказÑвалоÑÑCOLLATE "default"). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ в бÑдÑÑем, ÑÑÐ¾Ð±Ñ Ð½Ð° Ð¾Ð±Ð¾Ð¸Ñ ÑÑÐ°Ð¿Ð°Ñ ÑÑиÑÑвалоÑÑ ÑказаниеCOLLATEво Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð´Ð°Ð½Ð½ÑÑ .Тип
citextне Ñак ÑÑÑекÑивен, какtext, Ñак как ÑÑнкÑии опеÑаÑоÑов и ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ B-деÑева Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´ÐµÐ»Ð°ÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ даннÑÑ Ð¸ пеÑеводиÑÑ Ð¸Ñ Ð² нижний ÑегиÑÑÑ Ð´Ð»Ñ ÑÑавнениÑ. ÐÑоме Ñого, Ñ Ñипомtextвозможно иÑклÑÑение дÑбликаÑов в B-деÑеве. Тем не менее ÑcitextÑегиÑÑÑонезавиÑимое ÑÑавнение ÑеализÑеÑÑÑ ÑÑÑекÑивнее, Ñем Ñ Ð¿Ñименениемlower.Тип
citextмалополезен в ÑиÑÑаÑиÑÑ , когда вам нÑжно ÑÑавниваÑÑ Ð´Ð°Ð½Ð½Ñе без ÑÑÑÑа ÑегиÑÑÑа в Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ , и Ñ ÑÑÑÑом ÑегиÑÑÑа â в дÑÑÐ³Ð¸Ñ . ÐбÑÑно в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¸ÑполÑзÑÑÑtextи вÑÑÑнÑÑ Ð¿ÑименÑÑÑ ÑÑнкÑиÑlower, когда нÑжно вÑполниÑÑ ÑÑавнение без ÑÑÑÑа ÑегиÑÑÑа; ÑÑо пÑекÑаÑно ÑабоÑаеÑ, еÑли ÑегиÑÑÑонезавиÑимое ÑÑавнение ÑÑебÑеÑÑÑ Ð²ÑполнÑÑÑ Ð¾ÑноÑиÑелÑно Ñедко. ÐÑли же поÑÑи вÑегда ÑÑавнение должно бÑÑÑ ÑегиÑÑÑонезавиÑимÑм и ÑолÑко иногда ÑегиÑÑÑозавиÑимÑм, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑÐ¾Ñ ÑаниÑÑ Ð´Ð°Ð½Ð½Ñе в ÑÑолбÑе Ñипаcitext, и Ñвно пÑиводиÑÑ Ð¸Ñ Ðº ÑипÑtextÐ´Ð»Ñ ÑегиÑÑÑозавиÑимого ÑÑавнениÑ. РлÑбом ÑлÑÑае, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð° ваÑианÑа поиÑка бÑли бÑÑÑÑÑми, вам поÑÑебÑÑÑÑÑ Ð´Ð²Ð° индекÑа.Ð¡Ñ ÐµÐ¼Ð°, ÑодеÑжаÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑÑ
citext, должна Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² ÑекÑÑем пÑÑиsearch_path(обÑÑно ÑÑо ÑÑ ÐµÐ¼Ð°public); в пÑоÑивном ÑлÑÑае бÑдÑÑ Ð²ÑзÑваÑÑÑÑ ÑегиÑÑÑозавиÑимÑе опеÑаÑоÑÑ Ð´Ð»Ñ Ñипаtext.ÐÐ¾Ð´Ñ Ð¾Ð´ Ñ Ð¿ÐµÑеводом ÑÑÑок в нижний ÑегиÑÑÑ Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ ÑабоÑÐ°ÐµÑ Ð² некоÑоÑÑÑ Ð¾ÑобÑÑ ÑлÑÑаÑÑ Unicode, напÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð³Ð´Ð° одной бÑкве в веÑÑ Ð½ÐµÐ¼ ÑегиÑÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð´Ð²Ðµ бÑÐºÐ²Ñ Ð² нижнем ÑегиÑÑÑе. ÐоÑÑÐ¾Ð¼Ñ Ð² Unicode ÑазлиÑаÑÑÑÑ Ð¿Ð¾Ð½ÑÑÐ¸Ñ Ð¿ÑеобÑазование ÑегиÑÑÑа (case mapping) и вÑÑавнивание ÑегиÑÑÑа (case folding). ЧÑÐ¾Ð±Ñ ÑÑавнение пÑоизводилоÑÑ ÐºÐ¾ÑÑекÑно и в ÑÑÐ¸Ñ ÑлÑÑаÑÑ , иÑполÑзÑйÑе вмеÑÑо
citextнедеÑеÑминиÑованнÑе пÑавила ÑоÑÑиÑовки.
F.12.5. ÐвÑÐ¾Ñ #
ÐÑвид Ð. Ð£Ð¸Ð»ÐµÑ <[email protected]>
РазÑабоÑÐºÑ Ð²Ð´Ð¾Ñ
новил оÑигиналÑнÑй модÑÐ»Ñ citext ÐоналÑда ФÑейзеÑа.