2013-02-08 45 views
13

Sam Macbeth's question से:क्या जेडीबीसी स्पेक '?' को रोकता है एक ऑपरेटर (उद्धरण के बाहर) के रूप में इस्तेमाल होने से?

वहाँ JDBC कल्पना है जो एक के लिए अनुमति देता में कुछ भी है? बचने के लिए और एक पैरामीटर प्लेसहोल्डर के अलावा कुछ भी हो?

SELECT * FROM tbl WHERE tbl.data ? 'abc' 

एक JDBC ड्राइवर है कि आप का उपयोग करने देता चाहेंगे:

उदाहरण के लिए, Postgres आप एक ऑपरेटर के रूप में ? उपयोग करने के लिए अनुमति देता है? एक ऑपरेटर के रूप में अभी भी जेडीबीसी-अनुपालन हो?

उत्तर

6

मुझे लगता है कि यह पूरी तरह से स्वीकार्य होगा यदि जेडीबीसी चालक ? ऑपरेटर को अनचाहे होने के लिए अनुमति देता है और इसका उपयोग करता है, लेकिन यह 1) आपके पार्सर को वास्तव में इस ऑपरेटर से पैरामीटर की पहचान करने के लिए जटिल कर सकता है और 2) लोगों को (और शायद टूल्स) को भ्रमित कर सकता है जो ? पर उपयोग किए जाते हैं केवल सर्वो का अर्थ है प्लेसहोल्डर।

तो मेरा सुझाव कुछ प्रकार के बचने (या वैकल्पिक ऑपरेटर) प्रदान करना होगा। हालांकि जेडीबीसी स्पेक को देखते हुए, ड्राइवरों को जेडीबीसी स्पेक में परिभाषित एस्केप को लागू करने के लिए केवल जेडीबीसी एस्केप सिंटैक्स का उपयोग करना चाहिए (13.4.2: "एस्केप सिंटैक्स का उपयोग प्रयोक्ता परिभाषित या विक्रेता विशिष्ट स्केलर फ़ंक्शंस को आमंत्रित करने के लिए नहीं किया जाना चाहिए। "; हालांकि यह विशेष रूप से {fn ...} से बचने के बारे में है)।

तो या तो आपको वैकल्पिक बचने, या 'ब्रेक' नियमों का उपयोग करने की आवश्यकता है (मुझे नहीं लगता कि कोई भी दिमाग में होगा)। यदि आप अधिक अधिकृत उत्तर चाहते हैं, तो आप अपना प्रश्न jdbc-spec-discuss mailinglist पर भेज सकते हैं। मुझे यकीन है कि लांस एंडर्सन (जेडीबीसी स्पेस लीड) एक उत्तर प्रदान करेगा।

संपादित:

भी दिलचस्प ध्यान दें कि JDBC कल्पना अनुभाग 6.2 (दिशानिर्देश एवं आवश्यकताएँ) का कहना है:

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

तो इस पर आधारित है कि आपको ?-ऑपरेटर का समर्थन करना चाहिए (आपको जरूरी नहीं है), आपको बस इसे करने का व्यावहारिक तरीका ढूंढना होगा।


अद्यतन discussion on jdbc-spec-discuss

के आधार पर लांस एंडरसन के अनुसार JDBC विनिर्देश के निशान पर सवाल खड़ा करने के संबंध में एसक्यूएल विवरण इस प्रकार है: वे केवल (बेशक को छोड़कर क्वेरी पाठ में पैरामीटर प्लेसहोल्डर के रूप में इस्तेमाल किया जा सकता टिप्पणियों और उद्धृत पाठ में), ? के उपयोग के रूप में PostgreSQL hstore ऑपरेटरों में अनुमति नहीं दी जाएगी। (this message देखें)

उपलब्ध विकल्प या तो ऑपरेटर के लिए उपनाम या भागने के लिए उपलब्ध है, बशर्ते यह भविष्य में परिवर्तनों के साथ संघर्ष न करे (जो बिना किसी परेशानी के करना मुश्किल है;)। सबसे अच्छा समाधान - भविष्य में जेडीबीसी परिवर्तनों के साथ समस्याओं को रोकने के लिए - शायद एक कस्टम भागने है।

जेडीबीसी वास्तव में एक विक्रेता भागने को परिभाषित नहीं करता है, लेकिन लांस एंडर्सन जेडीबीसी से बचने वाले एक भागने का सुझाव देता है: {postgres <thing to be escaped>}; इस भागने में vendorname या drivername का उपयोग नामस्थान का एक रूप प्रदान करेगा जो विनिर्देश के साथ संघर्ष को रोकना चाहिए।(this message देखें)

साथ 'सामान्य' JDBC समारोह निकल जाता है लाइन में होना करने के लिए, मैं एक भागने है कि आपके सवाल में क्वेरी की अनुमति देगा परिभाषित करने के लिए सुझाव है कि कहा जा करने के लिए के रूप में:

SELECT * FROM tbl WHERE {postgres containskey(tbl.data, 'abc')} 

मैं containskey चुना में ? के अर्थ के आधार पर। ?&: containsallkeys) के लिए इसी तरह के सुझाव और ?|: containsanykey के लिए। स्थिरता के लिए आप अन्य हस्टोर ऑपरेटरों के लिए भी ऐसा करने पर विचार कर सकते हैं।

आप केवल प्रश्न चिह्न से बचने का निर्णय ले सकते हैं। उदाहरण के लिए {postgres '?'} या {postgres qm} (प्रश्न चिह्न के लिए qm) से बचें। आप नवीनतम PostgreSQL चालक है, तो

SELECT * FROM tbl WHERE tbl.data {postgres '?'} 'abc' 
4

मुझे JDBC specification में कुछ भी दिखाई नहीं देता है जो ? से बचने की अनुमति देगा। काफी यह सब कहते हैं के बारे में ? है: "?"

पैरामीटर मार्कर, एसक्यूएल स्ट्रिंग में द्वारा प्रतिनिधित्व, बयान है कि रनटाइम पर भिन्न हो सकते हैं करने के लिए इनपुट मान निर्दिष्ट किया जाता है। [1]

और बाद में ...

पैरामीटर ऑर्डिनल्स है, जो, approriate सेटर विधि को पारित कर दिया पूर्णांक हैं बयान में पैरामीटर मार्कर का उल्लेख ("?"), शुरू करने एक में [2]

और यह केवल सुविधाओं, जिनमें से कोई भी जैसे वे ? लिए लागू किया जा सकता है देखने के लिए का एक छोटा सेट के लिए वाक्यविन्यास बचने परिभाषित करता है:

JDBC को परिभाषित करता है निम्नलिखित के लिए वाक्य रचना से बच:

  • अदिश कार्यों
  • दिनांक और समय शाब्दिक
  • बाहरी मिलती
  • संग्रहित प्रक्रियाओं बुला [3]

कुल मिलाकर, यह JDBC विनिर्देश की तरह प्रतीत नहीं होता है बहुत "सख्त" भाषा (की तुलना में है की तरह खंड के लिए

  • भागने वर्ण , उदाहरण के लिए, का उपयोग करने वाले कुछ डब्ल्यू 3 सी विनिर्देश दस्तावेज और बहुत चाहिए), इसलिए मुझे नहीं पता कि एक ड्राइवर जिसने ? से बचने की अनुमति दी है वह तकनीकी रूप से गैर-अनुपालनशील होगा, लेकिन शायद यह नहीं होगा- तो Compatib le।

    यह भी ऐसा नहीं लगता है कि पोस्टग्रेस ड्राइवर भी इसे अनुमति देगा, ड्राइवर में विधि जो वास्तव में ?doesn't check for any escape characters के लिए एसक्यूएल कथन का विश्लेषण करती है।


    1. जेडीबीसी 4.1 विशिष्टता, धारा 13।2 — PreparedStatement इंटरफ़ेस
    2. JDBC 4.1 विशिष्टता, धारा 13.3.2 — स्थापना पैरामीटर
    3. JDBC 4.1 विशिष्टता, धारा 13.4 — भागने सिंटेक्स

  • +0

    तो जेडीबीसी शुद्धवादी शायद शिकायत नहीं करेंगे कि [पोस्टग्रेस जेडीबीसी '?'] से बचने के लिए लागू किया गया है (http://www.postgresql.org/message-id/[email protected]) ? –

    +0

    वैसे मैं वास्तव में किसी के लिए बात नहीं कर सकता लेकिन खुद, लेकिन मैं कहूंगा कि हैस्टोर ऑपरेटरों का उपयोग करने के उद्देश्य से '?' से बचने के लिए कार्यान्वयन करना काउंटर-उत्पादक होगा, क्योंकि ऐसा लगता है कि '?' हैस्टोर ऑपरेटर का मतलब है छोटे और पढ़ने के लिए आसान होने के लिए, और इससे बचने के लिए इसे और अधिक भारी और उलझन में डाल दिया जाएगा। (यह वैसे भी कैसा दिखता है? 'सी {?}' Foo''?) जैसा कि [एमेरिक के जवाब] में बताया गया है (http://stackoverflow.com/a/11958394/658907), पहले से ही 'अस्तित्व का उपयोग कर एक कामकाज है 'वह जेडीबीसी में काम करेगा। – matts

    +0

    @matts लेकिन उस उत्तर की टिप्पणियों में से एक के रूप में यह इंगित करता है: यह वही काम नहीं करता है ('मौजूद 'सूचकांक का उपयोग नहीं करता है) –

    6

    आप उपयोग कर सकते हैं:

    ?? 
    

    मूल प्रश्न में बदलना:

    SELECT * FROM tbl WHERE tbl.data ?? 'abc' 
    

    मैं पठनीयता मेरी समारोह-भागने सुझाव से भी कम है लगता है विवरण इस पुल अनुरोध में हैं - https://github.com/pgjdbc/pgjdbc/pull/227 यह परिवर्तन मूल प्रश्न के बाद बहुत लंबा था, लेकिन यह ध्यान देने योग्य है कि एक आसान उत्तर है अब एर

    +1

    दिलचस्प। आइए उम्मीद करें कि कभी भी '?? ऑपरेटर नहीं होगा ... –