2010-10-14 11 views
5

मैंने देखा कि जब मैं PreparedStatement का उपयोग करता हूं तो यह कुछ जंगली-कार्ड वर्णों जैसे '%' या '_' से बचने के लिए प्रतीत नहीं होता है। मुझे पता है कि बैकस्लैश का उपयोग करके इन्हें माईएसक्ल में से बचाया जा सकता है। इससे मुझे आश्चर्य हुआ, PreparedStatement भागने वाले कौन से पात्र होंगे?तैयार किए गए चरण से बचने वाले कौन से पात्र होंगे?

उत्तर

6

PreparedStatement कुछ भी नहीं बचता है - यह प्रीकंपील्ड स्टेटमेंट्स के लिए डेटाबेस समर्थन पर निर्भर करता है।

वह है, PreparedStatement कभी भी शाब्दिक क्वेरी स्ट्रिंग बनाने के लिए पैरामीटर मानों के लिए ? एस को प्रतिस्थापित नहीं करता है। इसके बजाए, यह डेटाबेस में प्लेसहोल्डर के साथ एक क्वेरी स्ट्रिंग भेजता है और क्वेरी पैरामीटर को बांधने के लिए डेटाबेस समर्थन का उपयोग करता है (हालांकि, यह जेडीबीसी ड्राइवर कार्यान्वयन पर निर्भर हो सकता है)।

+1

दिलचस्प, यह समर्थन MySQL के लिए कैसा दिखता है? – stevebot

+0

MySQL सर्वर पक्ष पर उसी तरह तैयार कथन का समर्थन करता है। आपके कोड में यह कैसा दिखता है उस ड्राइवर पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। –

+0

मेरा मानना ​​है कि कई ड्राइवर वास्तव में एसक्यूएल पाठ में बच निकले तर्क पाठ को सम्मिलित करते हैं। –

0

मेरे परीक्षण में, यह एकल उद्धरण चिह्न, \r, \t, \n और इससे आगे निकलता है। यह बहुत अच्छा काम करता है:

String sql = "INSERT INTO test(title) VALUES(?)"; 
PreparedStatement stmt = con.prepareStatement(sql); 
String title = "I'm a \"student\" in a \t (university) \r\n"; 
stmt.setString(1, title); 
stmt.executeUpdate(); 
+0

यह आपके ड्राइवर/डीबी के लिए विशिष्ट हो सकता है। जैसा कि एक्स्टाव उल्लेख किया गया है, अधिकांश स्वचालित रूप से इनपुट से बच नहीं पाते हैं। – Leigh

संबंधित मुद्दे