ठीक है, यह केवल डबल-एस्केपिंग है, लेकिन हाँ यह काम करता है और यहाँ क्यों है:MySQL में, जब आप LIKE
का उपयोग करते हैं, तो इसमें शामिल होने से बचने की दूसरी परत होती है। ऑपरेटर।
services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
पार्स करना कि MySQL स्ट्रिंग शाब्दिक आपको LIKE-query %L\\u00e4mm\\u00f6n%
के साथ तुलना देता है . क्योंकि MySQL \
. का व्यवहार करता है एक LIKE क्वेरी में एस्केप के रूप में, जो वास्तव में L\u00e4mm\u00f6n
वाले शाब्दिक स्ट्रिंग से मेल खाएगा ।
इसका कारण यह है कि आप एक शाब्दिक %
. वाले क्वेरी एक्सप्रेशन के विरुद्ध स्ट्रिंग्स का मिलान कर सकते हैं या _
चरित्र। उदाहरण के लिए यदि मैं शाब्दिक स्ट्रिंग के लिए एक कॉलम खोजना चाहता हूं 100%
, मैं इसका मिलान 100\%
. से कर सकता हूं (क्वेरी में '100\\%'
. के रूप में लिखा गया है ) और सुनिश्चित करें कि मैं वास्तव में एक सौ प्रतिशत प्राप्त कर रहा हूं और सौ से शुरू होने वाली कोई स्ट्रिंग नहीं।
यह दुर्भाग्यपूर्ण है कि MySQL बैकस्लैश का उपयोग अपनी LIKE क्वेरी से बचने और इसके स्ट्रिंग शाब्दिक भागने दोनों के लिए करता है, विशेष रूप से यह देखते हुए कि आप शायद एक संलग्न प्रोग्रामिंग भाषा में लिख रहे हैं जो उनका उपयोग करता है, वास्तविक ट्रिपल-एन्कोडिंग के साथ समाप्त होता है, जो "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- अर्घ!
यह दोगुना दुर्भाग्यपूर्ण है कि यह व्यवहार एएनएसआई एसक्यूएल अनुरूप नहीं है, और किसी अन्य डेटाबेस में काम नहीं करेगा। एएनएसआई एसक्यूएल का कहना है कि डिफ़ॉल्ट रूप से LIKE प्रश्नों में कोई एस्केप कैरेक्टर नहीं है, इसलिए यदि आप एक शाब्दिक %
से मेल खाना चाहते हैं या _
आपको अपने स्वयं के एस्केप कैरेक्टर को नामांकित करके ऑप्ट इन करना होगा, जैसे:
something LIKE '100=%' ESCAPE '='
क्रॉस-डेटाबेस संगतता के लिए, LIKE
. का उपयोग करना हमेशा सर्वोत्तम होता है ...ESCAPE
फॉर्म, और भयानक बैकस्लैश के अलावा कुछ और चुनें! (इसके अलावा - SQL स्ट्रिंग शाब्दिक भागने के लिए MySQL के बैकस्लैश एएनएसआई अनुरूप नहीं हैं! लेकिन आप उस दुर्व्यवहार को NO_BACKSLASH_ESCAPES sql_mode सेटिंग के साथ बंद कर सकते हैं।)
services
को तोड़ना शायद एक बेहतर विचार होगा एक स्ट्रिंग कॉलम में उन्हें स्क्वैश करने के बजाय दूसरी तालिका में बाहर करें - यानी। अपनी स्कीमा को पहले सामान्य रूप में रखें। तब आप धीमी फुल-टेबल-स्कैन सबस्ट्रिंग-मैच करने के बजाय व्यक्तिगत मूल्यों का एक सरल लुकअप प्राप्त कर सकते हैं।