हाँ, यह एक असली गड़बड़ है। MySQL और PostgreSQL दोनों डिफ़ॉल्ट रूप से बैकस्लैश-एस्केप का उपयोग करते हैं। यह एक भयानक दर्द है यदि आप पैरामीटरकरण का उपयोग करने के बजाय बैकस्लैश के साथ फिर से स्ट्रिंग से बच रहे हैं, और यह एएनएसआई एसक्यूएल: 1 99 2 के अनुसार भी गलत है, जो कहता है कि सामान्य स्ट्रिंग से बचने के लिए डिफ़ॉल्ट रूप से कोई अतिरिक्त भागने वाले वर्ण नहीं हैं, और इसलिए एक शाब्दिक %
या _
शामिल करने का कोई तरीका नहीं है।
मैं, अनुमान हैं सरल बैकस्लैश-बदलें विधि भी गलत हो जाता है अगर तुम बैकस्लैश-पलायन (जो खुद ANSI SQL के साथ गैर अनुपालन किया जा रहा) बंद कर देते हैं (MySQL में NO_BACKSLASH_ESCAPE
sql_mode या PostgreSQL में standard_conforming_strings
conf का उपयोग कर जो PostgreSQL देव अब कुछ संस्करणों के लिए करने की धमकी दे रहे हैं)।
LIKE
-pattern के लिए एक स्पष्ट बचने के चरित्र को निर्दिष्ट करने के लिए एकमात्र असली समाधान छोटे ज्ञात LIKE...ESCAPE
वाक्यविन्यास का उपयोग करना है। इसका उपयोग MySQL और PostgreSQL में बैकस्लैश-एस्केप के बजाय किया जाता है, जो उन्हें हर किसी के अनुरूप बनाता है और आउट-ऑफ-बैंड वर्णों को शामिल करने के लिए एक गारंटीकृत तरीका प्रदान करता है। पलायन के रूप में =
संकेत के साथ उदाहरण के लिए:
# look for term anywhere within title
term= term.replace('=', '==').replace('%', '=%').replace('_', '=_')
sql= "SELECT * FROM things WHERE description LIKE %(like)s ESCAPE '='"
cursor.execute(sql, dict(like= '%'+term+'%'))
यह PostgreSQL, MySQL, और ANSI SQL अनुरूप डेटाबेस पर काम करता है (जो अलग db मॉड्यूल पर परिवर्तन निश्चित रूप से paramstyle सापेक्ष)।
एमएस एसक्यूएल सर्वर/साइबेस के साथ अभी भी कोई समस्या हो सकती है, जो स्पष्ट रूप से [a-z]
-स्टाइल चरित्र समूह LIKE
अभिव्यक्तियों में भी अनुमति देता है। इस मामले में आप के साथ शाब्दिक [
वर्ण से बचना चाहेंगे। हालांकि एएनएसआई एसक्यूएल के अनुसार एक ऐसे चरित्र से बचने के लिए जिसे बचने की आवश्यकता नहीं है अमान्य है! (Argh!) तो हालांकि यह अभी भी असली डीबीएमएस में काम करेगा, फिर भी आप एएनएसआई-अनुरूप नहीं होंगे। आह ...
आप "'" और' '' –
@JensTimmerman भूल गए हैं, यह फ़ंक्शन केवल एक टोकन से बचता है, सामान्य क्वेरी को क्वेरी में उपयोग करने से पहले परिणाम से बचने के लिए। सही स्ट्रिंग एस्केपिंग 'standard_conforming_stings'' पर निर्भर करती है और तो पुस्तकालय कोड का उपयोग करके सबसे अच्छा किया जाता है। – Jasen