एक मान सम्मिलित करने के लिए कैसे जिसमें एक एपोस्ट्रोफ (एकल उद्धरण) शामिल है?


310

इसमें एक एपोस्ट्रोफी के साथ एक मूल्य सम्मिलित करने के लिए सही एसक्यूएल सिंटैक्स क्या है?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

मुझे एक त्रुटि मिलती रहती है क्योंकि मुझे लगता है कि मान के लिए ओ समाप्त होने के बाद एपोस्ट्रोफ है।


16
कृपया पुष्टि करें कि आप SQL इंजेक्शन हमलों के लिए खुद को नहीं खोल रहे हैं। उन मापदंडों का उपयोग करें जहां हर संभव हो।
एंड्रयू

आप किस स्क्रिप्टिंग भाषा का उपयोग कर रहे हैं? PHP में फ़ंक्शन हैं, उदाहरण के लिए, यह आपके लिए सही ढंग से करने के लिए।
फिल्फेरो

यहां एंड्रयू से सहमत: मुझे उम्मीद है कि यह सवाल केवल SQL क्लाइंट या "क्वेरी ब्राउज़र" के माध्यम से SQL चलाने के संबंध में है या ऐसा नहीं है और वास्तव में उत्पादन कोड में कहीं नहीं है। पैरामीटर किए गए कथनों का उपयोग नहीं करना मूर्खतापूर्ण है।
चार

यह वास्तव में कोड में है .. अगर मैं एक पैरामीटर क्वेरी करता था तो मुझे वही काम नहीं करना होगा?
लीओरा

2
नकारात्मक। डेटाबेस और आपके द्वारा उपयोग किए जा रहे ड्राइवर के आधार पर, मापदंडों के अलगाव को अलग-अलग तरीके से नियंत्रित किया जा सकता है, लेकिन एक पैरामीटर वाले बयान में पैरामीटर को भागने की आवश्यकता नहीं होती है। En.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

जवाबों:


485

अपनी एसक्यूएल में एपोस्ट्रोफ (यानी सिंगल-अप क्वैस कैरेक्टर को डबल-अप) से बचिए:

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

वही चयनित प्रश्नों पर लागू होता है:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

एपोस्ट्रोफ, या एकल उद्धरण, एसक्यूएल में एक विशेष चरित्र है जो स्ट्रिंग डेटा की शुरुआत और अंत को निर्दिष्ट करता है। इसका मतलब यह है कि इसे अपने शाब्दिक स्ट्रिंग डेटा के हिस्से के रूप में उपयोग करने के लिए आपको escapeविशेष चरित्र की आवश्यकता है । एक एकल उद्धरण के साथ यह आमतौर पर आपकी बोली को दोगुना करके पूरा किया जाता है। (दो एकल उद्धरण वर्ण, एकल उद्धरण के बजाय डबल-उद्धरण नहीं।)

नोट : आपको केवल इस मुद्दे पर कभी चिंता करनी चाहिए जब आप मैन्युअल रूप से कच्चे SQL इंटरफ़ेस के माध्यम से डेटा संपादित करते हैं क्योंकि विकास और परीक्षण के बाहर प्रश्न लिखना दुर्लभ घटना होना चाहिए। कोड में तकनीक और रूपरेखा (आपके स्टैक के आधार पर) हैं जो विशेष वर्ण, SQL इंजेक्शन , आदि से बचने का ख्याल रखते हैं ।


6
$ linkQuestion = str_replace ( " '" "' '", $ linkQuestion), (भगवान कि मुश्किल है पढ़ने के लिए!)
user462990

क्या होगा यदि डेटा व्यक्ति (प्रथम, अंतिम) मान 'जो', 'पिता की दुकान' में डाला जाता है।
विजेश


21

आपको धर्मत्याग से बचने की आवश्यकता है। में T-SQL इस, एक डबल apostrophe के साथ है तो अपने insertबयान हो जाता है:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'

AFAIK को Valuesब्रेसिज़ में संलग्न किया जाना चाहिए (जो तब @JustinNiessner के समान ही उत्तर देता है)
qwerty_so

15

क्योंकि एक स्ट्रिंग के प्रारंभ और अंत को इंगित करने के लिए एक एकल उद्धरण का उपयोग किया जाता है; आपको इससे बचने की जरूरत है।

संक्षिप्त उत्तर दो एकल कोट्स का उपयोग करना है - ''- जैसे कि मूल्य को संग्रहीत करने के लिए SQL डेटाबेस के लिए '

आने वाले मूल्यों को साफ करने के लिए REPLACE का उपयोग कर देखें:

आप के लिए जाँच करना चाहते हैं '''', और उन्हें बदलने के लिए अगर वे ''''''एक एकल उद्धरण से बचने के लिए स्ट्रिंग में मौजूद हैं ।


3

एडफी का एक अच्छा विचार था । वह सिर्फ अपने कोड उदाहरण में इसे पीछे से मिला। या तो जावास्क्रिप्ट में या SQLite में आप उच्चारण चिह्न के साथ एपोस्ट्रोफ को बदल सकते हैं।

उन्होंने (गलती से मुझे यकीन है) ओ ब्रायन में एपोस्ट्रोफ को बदलने के बजाय स्ट्रिंग के लिए सीमांकक के रूप में उच्चारण चिह्न रखा। यह वास्तव में ज्यादातर मामलों के लिए एक सरल समाधान है।


महान और अधिक सरल समाधान और मेरा अंतिम नाम O`Reilly है!
फिलिप्पोरेली 11

वैसे भी पलायन पात्रों का उपयोग करने की सलाह दी जाती है। अकस्मात :) मैं जिस दिन से कीबोर्ड का उपयोग कर रहा हूं। मैं दस्तावेजों को लिखते समय एक उद्धरण के स्थान पर अनायास ही उच्चारण चिह्न का उपयोग कर रहा हूं। (हालांकि कोड में मैं 'चार पहचानकर्ता के रूप में उपयोग करता हूं)। पिछले साल तक जब कोई मुझे अपना पासवर्ड बताता था और मैं उसके सिस्टम में लॉगिन नहीं कर पाता था। हम घंटों तक यह पता नहीं लगा सके कि मैं 'के रूप में' टाइप कर रहा हूं।
लर्नर

3

एपोस्ट्रोफ के ASCII टेबल लुकअप वैल्यू के साथ CHAR फ़ंक्शन को कॉल करके एपोस्ट्रोफ वर्ण डाला जा सकता है । 39. स्ट्रिंग मानों को फिर एक कॉन्टेनेट ऑपरेटर के साथ एक साथ जोड़ा जा सकता है ।

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')

2

एकल उद्धरण उन्हें दोगुना करने से बच जाते हैं ,

निम्न SQL इस कार्यक्षमता को दिखाता है।

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

परिणाम

First   | Last
===================
Joe     | O'Brien

0

मूल्यों के आसपास दोहरे उद्धरण चिह्नों का उपयोग करें।

insert into Person (First, Last) Values("Joe","O'Brien")

3
ध्यान दें कि यह मानक SQL किसी भी अधिक नहीं है, हालांकि मुझे पता है कि नाम के लिए Informix पता है, लेकिन एक DBMS, इसे अनुमति देता है। आपको यह भी पता होना चाहिए कि आप He said, "Don't!"एक उद्धरण कैसे डाल सकते हैं जैसे कि एकल उद्धरण और / या दोहरे उद्धरणों का उपयोग करना - जो किया जा सकता है: 'He said, "Don''t!"'या "He said, ""Don't!"""। स्वीकृत उत्तरों के साथ एक लंबे समय से स्थापित प्रश्न के लिए एक नया उत्तर जोड़ते समय, आपको नई, पूरी जानकारी प्रदान करनी चाहिए। दोहरे उद्धरण चिह्नों का उपयोग करना नया है - लेकिन कुछ DBMS तक सीमित है; आपको उन लोगों में से कम से कम एक की पहचान करने के लिए दर्द उठाना चाहिए जो उन्हें स्वीकार करता है।
जोनाथन लेफ्लर

-1

इसके बजाय एक बैकटिक का उपयोग करें (~ कुंजी पर);

`O'Brien`

1
फिर समस्या यह हो जाती है: बैकटिक कैसे डालें?
जैस्पर डे व्रीस

1
हालांकि यह "सही" उत्तर नहीं है, मैं उन नामों के एक सेट के साथ काम कर रहा हूं जिनके पास यह नहीं है, और मैं एक ऑपरेशन बंद कर रहा हूं, इसलिए इसने तुरंत मेरी समस्या हल कर दी। धन्यवाद!
nscalf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.