हाँ, यह एक वास्तविक गड़बड़ है। MySQL और PostgreSQL दोनों डिफ़ॉल्ट रूप से इसके लिए बैकस्लैश-एस्केप का उपयोग करते हैं। यह एक भयानक दर्द है यदि आप पैरामीटर का उपयोग करने के बजाय बैकस्लैश के साथ फिर से स्ट्रिंग से बच रहे हैं, और यह एएनएसआई एसक्यूएल:1992 के अनुसार भी गलत है, जो कहता है कि डिफ़ॉल्ट रूप से सामान्य स्ट्रिंग से बचने के शीर्ष पर कोई अतिरिक्त बचने वाले वर्ण नहीं हैं, और इसलिए शाब्दिक %
. को शामिल करने का कोई तरीका नहीं है या _
।
मुझे लगता है कि यदि आप NO_BACKSLASH_ESCAPE
का उपयोग करके बैकस्लैश-एस्केप (जो स्वयं एएनएसआई एसक्यूएल के साथ गैर-अनुपालक हैं) को बंद कर देते हैं, तो सरल बैकस्लैश-प्रतिस्थापन विधि भी गलत हो जाती है। MySQL में sql_mode या standard_conforming_strings
conf PostgreSQL में (जो PostgreSQL देव अब कुछ संस्करणों के लिए करने की धमकी दे रहे हैं)।
एकमात्र वास्तविक समाधान अल्पज्ञात LIKE...ESCAPE
. का उपयोग करना है LIKE
. के लिए एक स्पष्ट एस्केप कैरेक्टर निर्दिष्ट करने के लिए सिंटैक्स -नमूना। इसका उपयोग 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+'%'))
यह पोस्टग्रेएसक्यूएल, माईएसक्यूएल, और एएनएसआई एसक्यूएल-अनुपालन डेटाबेस पर काम करता है (निश्चित रूप से पैरामस्टाइल मॉड्यूल जो विभिन्न डीबी मॉड्यूल पर बदलता है)।
MS SQL Server/Sybase में अभी भी कोई समस्या हो सकती है, जो स्पष्ट रूप से [a-z]
को भी अनुमति देता है। -स्टाइल वर्ण समूह LIKE
. में भाव। इस मामले में आप शाब्दिक [
. से भी बचना चाहेंगे वर्ण के साथ .replace('[', '=[')
. हालांकि एएनएसआई एसक्यूएल के अनुसार एक ऐसे चरित्र से बचने के लिए जिसे बचने की आवश्यकता नहीं है, अमान्य है! (अर्घ!) तो हालांकि यह अभी भी वास्तविक डीबीएमएस में काम करेगा, फिर भी आप एएनएसआई-अनुपालन नहीं होंगे। आहें...