LIKE स्टेटमेंट में अक्षरशः मिलान करने के लिए _ और % वर्णों को उद्धृत किया जाना चाहिए, इसके आसपास कोई रास्ता नहीं है। विकल्प इसे क्लाइंट-साइड, या सर्वर-साइड (आमतौर पर SQL रिप्लेस () का उपयोग करके, नीचे देखें) करने के बारे में है। साथ ही सामान्य स्थिति में इसे 100% सही करने के लिए, कुछ बातों पर विचार करना होगा।
डिफ़ॉल्ट रूप से, _ या% से पहले उपयोग किया जाने वाला कोट कैरेक्टर बैकस्लैश (\) है, लेकिन इसे LIKE क्लॉज के तुरंत बाद ESCAPE क्लॉज के साथ बदला जा सकता है। किसी भी स्थिति में, कोट कैरेक्टर को पैटर्न में दो बार दोहराया जाना चाहिए। शाब्दिक रूप से एक वर्ण के रूप में मिलान किया जा सकता है।
उदाहरण:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^'
जैसे फ़ील्ड john%node1^[email protected] . से मेल खाएगा उसके बाद कुछ भी।
बैकस्लैश के डिफ़ॉल्ट विकल्प के साथ एक समस्या है:यह पहले से ही अन्य उद्देश्यों के लिए उपयोग किया जाता है जब standard_conforming_strings बंद होता है (PG 9.1 में यह डिफ़ॉल्ट रूप से चालू होता है, लेकिन पिछले संस्करण अभी भी व्यापक उपयोग में हैं, यह विचार करने का एक बिंदु है)।
इसके अलावा, यदि उपयोगकर्ता इनपुट इंजेक्शन परिदृश्य में LIKE वाइल्डकार्ड के लिए उद्धरण क्लाइंट-साइड किया जाता है, तो यह के अतिरिक्त आता है उपयोगकर्ता इनपुट पर पहले से ही आवश्यक सामान्य स्ट्रिंग-उद्धरण के लिए।
go-pgsql उदाहरण पर एक नज़र यह बताती है कि यह चर के लिए $N-शैली प्लेसहोल्डर का उपयोग करता है... तो यहाँ इसे किसी तरह सामान्य तरीके से लिखने का प्रयास किया गया है:यह ON या OFF दोनों के साथ standard_conforming_strings के साथ काम करता है, सर्वर-साइड प्रतिस्थापन का उपयोग करता है [%_], एक वैकल्पिक उद्धरण वर्ण, उद्धरण वर्ण का उद्धरण, और sql इंजेक्शन से बचा जाता है:
db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
variable_user_input);