आप एक शाब्दिक बैकस्लैश इंजेक्ट कर रहे थे। यह काफी है:
SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'
परीक्षण करने के लिए:
SELECT 'O\\\'Brien', 'O\'Brien'
अपडेट करें: पहले से ही एक स्वीकृत उत्तर है इसलिए मैं केवल कुछ स्पष्टीकरण जोड़ूंगा।
सबसे पहले, मैंने इस तथ्य की अनदेखी की थी कि संग्रहीत डेटा दूषित हो गया था। कहने की जरूरत नहीं है, यह बताता है कि क्यों person_sname = 'O\\\'Brien' सच है।
दूसरा, \ MySQL सिंटैक्स में कैरेक्टर के दो उपयोग हैं:
- यह वह वर्ण है जिसका उपयोग एस्केप सीक्वेंस
:
\n,\t... - यह शाब्दिक
%डालने के लिए डिफ़ॉल्ट एस्केप चार है और_LIKE एक्सप्रेशन में वर्ण :foo LIKE '%abc\%def%'
समस्या यह है कि एक \ . डालने से LIKE एक्सप्रेशन में प्रतीक दोनों व्यवहारों को ट्रिगर करता है इसलिए आपको वास्तव में चार . डालने की आवश्यकता होती है एक पाने के लिए बैकस्लैश :
person_sname like 'O\\\\\'Brien'
... जब तक आप ESCAPE . के साथ दूसरा अर्थ नहीं बदलते खंड:
person_sname like 'O\\\'Brien' escape '|'
बेशक, अगर डेटा दूषित नहीं होता तो आप आसानी से कर सकते हैं:
person_sname = 'O\'Brien'
person_sname like 'O\'Brien'