Internet Derazalar Android
Kengaytirmoq

MySQL - qanday qilib shablon yordamida qidirish (ro'yxatdan o'tishni istisno qilish). Ro'yxatdan o'tmasdan chiziqlarni taqqoslash.

ishni sezgir (12)

Men atrofga qaradim va menga kerakligini topa olmadim.

Tan daraxtlaridan * daraxtlar. "% Elm%" kabi

Bu juda yaxshi ishlaydi, lekin daraxtning qarag'ay yoki elm deb ataladigan bo'lsa va hokazo ...

Qanday qilib SQL reestrini ushbu qidiruvga ko'rinmas qilib qo'yish mumkin?

Men mysql 5 va Apache-dan foydalanaman.

Javoblar.

Men shunga o'xshash narsani qilaman.

Kichik holatda qiymatlarni olish va mysql hamma narsani qiladi

$ String \u003d $ _get ["satr"]; Mysqli_quarery ($ cowing,) pastki (loln_name) ni past darajadagi ("% $ %%") ") yoqadi");

Va mysql pdo uchun:

$ String \u003d $ _get ["satr"]; $ Sav \u003d "" Plecter_name-dan pastga (Ustun_name) pastroq (?); "; $ So'rov \u003d $ dbconnection-\u003e Tayyorlash ($ Q); $ So'rov -\u003e Bindvaluue (1, "% $%", pdo :: Param_str); $ So'rov -\u003e Bajarish ();

"% Elm%" kabi "% Elm%" kabi sozlangan daraxtlardan * ni tanlang

Aslida, agar siz utf8_general_ci-ni qo'shsangiz, bu barcha fokuslarni shunchaki tark qilishingiz mumkin: u avtomatik ishlaydi.

Alinter stolli daraxtlar UTF8 Callelle Callelle Callelle Callelle Callelle Callelle Callelle Callelle Callelle Callite Calle-ni o'rnating.

Shuningdek, u ushbu ustunda har qanday indeksni tiklaydi, shunda ular "%" ni ko'rsatmasdan so'rovlar uchun ishlatilishi mumkin

Sizga har qanday stolni o'zgartirish kerak emas. To'rrirlashdan oldin quyidagi so'rovlardan foydalaning, siz Wilderard belgisini ishlatishni istagan tanlash uchun:

Ismlar UTF8-ni o'rnating; Colleon_Connecececection \u003d UTF8_Gughal_ci; Belgi_set_client \u003d utf8; Belf8 belgisini qo'ying_et_Rusults \u003d UTF8;

mySQL 5.5-da, beixtiyor ... Shuning uchun, agar vodiyingiz elm yoki elm yoki elm bo'lsa va "% elm%" bo'lsa, u barcha tegishli qiymatlarni ko'rsatadi.

Men MySQLning oldingi versiyalari haqida ayta olmayman.

Masalan, siz Oracle-ga o'tsangiz, ro'yxatdan o'ting, shuning uchun agar siz "% Elm%" ni olsangiz, u faqat shu uchun faqat kerak bo'ladi va yuqori hududlarga e'tibor bermaydi.

G'alati, lekin shunday :)

Bu oddiy iltimosning namunasidir:

* Ni tanlang.

Qayerda Kabi "% %"

Endi pastki funktsiyadan foydalangan holda reestrdan tashqari:

* Ni tanlang.

Qayerda pastki ( ) Pastki kabi ("% %")

Cho'milizni ishlab chiqmoqchi bo'lganimda qidiruv so'rovlariMen har doim taqqoslashdan oldin har bir satrni pastroq ro'yxatga aylantiraman

Siz stolingizni to'g'ri kodlash va xaritalashingiz kerak.

Stol kodlashi haqiqiy ma'lumotlarni kodlashni aks ettirishi kerak. Ma'lumotlar kodlashingiz qanday?

Stol kodlashini ko'rish uchun siz shou-ni boshlashingiz mumkin

Murojaat qilishdan keyin qo'shing. Ushbu usul satrni satrga aylantiradi. Keyin Ral o'rniga ral yordamida foydalaning.

Agar (ruxsatnomacher.tolowcer.tolowcer.tolowcer (). Indeksof ("Ral") \u003d\u003d\u003d -1) (

Xuddi shu narsani amalga oshirish mumkin muntazam ifoda (Dinamik shablonlarni sinashni istaganingizda, ayniqsa foydali):

Agar (!) (Maslahatchi) (// ^ i \u003d RejExp uchun katta bayroqni e'tiborsiz qoldirsangiz)

Facet CTYPE sizga individual belgilarni taqqoslash asosida ro'yxatdan o'tmasdan, ro'yxatdan o'tishni osongina tartibga solish imkonini beradi. Quyidagi versiya eng maqbul emas, lekin hech bo'lmaganda u haqiqat. Bu avvalgidek bir xil printsipdan foydalanadi: liniyalar Leksikaografik_ algoritm bilan taqqoslanadi va individual belgilar yuqori registrga olib keladi. Biroq, bu safar global o'zgaruvchi o'rniga mahalliy kontekstning ob'ekti qo'llaniladi. Aytgancha, ikkalasini ham yuqori ro'yxatga keltirgandan so'ng taqqoslash har doim ham pastki registrga olib keladigan natijada bir xil natija bermaydi. Masalan, frantsuz tillarida eng yuqori reestr belgilari bilan, bu frantsuz mahalliy kontekstida kontekstni yo'qotish odat tusiga kiradi: "E" va "E" belgilari haqida ma'lumot yo'qolishi mumkin "E" eng yuqori ro'yxatning bitta ramziga aylantiriladi. Bunday holda, taqqoslash funktsiyasi bilan taqqoslaganda "E" va "E" belgilari bir xil bo'lib, ular bilan taqqoslaganda, ular boshqacha deb hisoblanadi. Javoblarning qaysi biri to'g'ri? Ehtimol, ikkinchisi, lekin aslida barchasi tilga, milliy urf-odatlarga va dasturning o'ziga xos xususiyatlariga bog'liq.

: Davlat stdi :: Binkin_funktsiya (

const STD :: CTTTE & CT:

lt_char (Const STD :: CTTTE & C): CT (c) ()

bool operatori () (Car x. Char y) konst (

cT.Topper (x)

sTD :: Yashil bo'sh joy;

const STD :: CTTTE & CT;

lt_str_str_l (STD :: Yashile & L \u003d STD :: joylashuvi: klassik ())

: CT (L), CT (STD :: Foyda_faset<:ctype>(LOG)) ()

bool Operator () () Strik: String & X, Const STD ::

sTD-ni qaytaring: Leksikaografik_compare (X.Begin (X.Begin (). X.end (),

y.Begin (), y.end (), lt_char (CT));

Ushbu qaror maqbul emas; U ishlashi mumkin bo'lgandan ko'ra sekinroq ishlaydi. Muammo sof texnik: egper funktsiyasi tsiklda chaqiriladi va C ++ Standard ushbu funktsiyani virtual bo'lishini talab qiladi. Ba'zi optimallar tsikldan virtual funktsiyani namoyish etmoqda, ammo bu tez-tez sodir bo'lmaydi. Tsiklik virtual xususiyatlar keraksiz.

Bunday holda, arzimas echim mavjud emas. Fikr paydo bo'ladi - CTTE Ob'ektining xususiyatlaridan birini ishlating:

conce char * ctype :: sinper (char * f, men) Const

Ushbu xususiyat vaqt oralig'ida belgilar ro'yxatini o'zgartiradi. Afsuski, bizning maqsadlarimiz uchun ushbu interfeys mos emas. Ushbu xususiyatdan ikkita qatorni taqqoslash uchun foydalanish uchun siz ikkala satrni ham tampon ichida nusxalashingiz va o'z tarkiblarini yuqori registrga aylantirishingiz kerak. Ammo bu tamponlar qayerdan keladi? Ular atamali massivlar bo'lishi mumkin emas (nima bo'lish kerakligi noma'lum maksimal hajmi), va dinamik massivlar qimmat xotirani taqsimlashni talab qiladi.

Muqobil echim har bir belgini keshlash bilan bir marta konversiya qilishdan iborat. Bunday yechim umumbashariy, xususan, 32 bit UCS-4 belgidan foydalanganda, bu mutlaqo ishlamayotganda. Boshqa tomondan, char turi (ko'p sonli tizimlarda 8 bitli), taqqoslash funktsiyasi ob'ektida qo'shimcha ma'lumotni saqlash g'oyasi juda haqiqiy ko'rinadi.

sporativ lt_str_2:

davlat stdi :: Binkin_funktsiya (

konstan char * tab;

lt_char (Conce char * t): tab (t) ()

bool Operator () (Car x, char Y) konst (

qaytish yorlig'i.

char yorlig'i;

lt_str_2 (Const STD :: Yashile & L \u003d STD:. Boshqa manzil: klassik ()) (Klassik ()) (

const STD :: CTTTE & CT \u003d STD :: Foyda bering_faset<:ctype>(L);

uchun (int i \u003d char_min; i

ct.tupper (jadval. Tab + (Char_max-Char_min + 1));

bool Operator () (STD :: Str & x. Const STD :: Str:

sTD :: Lexika drikaPare (X.Begin (X.Begin (), x.end (),

y.begin (), y.end (), lt_char (tab));

Ko'rinib turibdiki, lt_str_1 va lt_str_2 o'rtasidagi farq unchalik katta emas. Birinchi holatda CTYPE faylidan foydalangan holda belgilarning taqqoslash funktsiyasi to'g'ridan-to'g'ri ishlatiladi va ikkinchi holatda, taqqoslash funktsiyasining yuqori registrga kiritilgan. Ikkinchi echim, agar siz Ob'ekt ob'ekti lt_str_2 ni yaratsangiz, avvalgisidan foydalansangiz, undan bir nechta qisqa qatorlarni taqqoslang va yo'q qiling. Boshqa tomondan, ko'p miqdordagi ma'lumotlarni qayta ishlashda, u juda tezroq lt_str_1 ishlaydi. Sinovlarimda ustunlik ikki baravar ko'p edi: LT_str_l-dan foydalanganda, so'zlarni saralash 23,791 raqami va LT_str_2-dan foydalanganda, u atigi 0,4 soniyadan foydalanganda.

Xo'sh, biz nimani bilamiz?

Sytaj reytingi registrini hisobga olgan holda satr klassi mavhumning noto'g'ri darajasida amalga oshiriladi. C ++ kutubxonasi standartlashtirilgan algoritmlar parametrlar mavjud va bu haqiqatdan foydalanish kerak.

Leksikografik chiziqlar taqqoslash individual belgilar bilan taqqoslanadi. Agar sizda ishni ro'yxatdan o'tkazmasdan taqqoslash funktsiyalari bo'lsa, vazifa aslida hal qilinadi va ushbu ob'ektni vektorli va doimiy jadvallar yoki oddiy liniyalar kabi o'zgartirish uchun ishlatilishi mumkin.

Ro'yxatdan o'tishsiz qatorlar ro'yxatdan o'tmasdan yo'riqnomani taqqoslash vazifasi birinchi qarashda ko'rinadi. Bu faqat ma'lum bir mahalliy kontekstda mantiqiy ahamiyatga ega, shuning uchun taqqoslash funktsiyasi ob'ektida joriy mahalliy kontekst haqida ma'lumot bo'lishi kerak. Agar taqqoslash tezlik bilan optimallashtirilsa, Funktsiya ob'ekti Quduq operatsiyalarini jabrlanmaslik uchun bir nechta qo'ng'iroqni oldini oling.