एक SQLite क्वेरी में उपयोग के लिए एकल उद्धरण चरित्र से बच


180

मैंने डेटाबेस स्कीमा (अब तक केवल एक तालिका), और एक फ़ाइल में उस तालिका के लिए INSERT विवरण लिखे। फिर मैंने डेटाबेस इस प्रकार बनाया:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error

मेरी फाइल की लाइन 16 कुछ इस तरह दिखती है:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

समस्या एकल उद्धरण के लिए भागने का चरित्र है। मैंने एकल उद्धरण से बचने की दोहरी कोशिश की ( \\\'इसके बजाय का उपयोग करके \'), लेकिन यह भी काम नहीं किया। मैं क्या गलत कर रहा हूं?

जवाबों:


294

एकल उद्धरणों को दोगुना करने का प्रयास करें (कई डेटाबेस इस तरह से उम्मीद करते हैं), इसलिए यह होगा:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

प्रलेखन से प्रासंगिक उद्धरण :

एकल उद्धरण (') में स्ट्रिंग को संलग्न करके एक स्ट्रिंग स्थिरांक का निर्माण किया जाता है। स्ट्रिंग के भीतर एक एकल उद्धरण एक पंक्ति में दो एकल उद्धरण डालकर एन्कोड किया जा सकता है - जैसे पास्कल में। सी-स्टाइल बैकस्लैश कैरेक्टर का उपयोग करके बच जाती है क्योंकि वे मानक एसक्यूएल नहीं हैं। BLOB शाब्दिक हेक्साडेसिमल डेटा वाले स्ट्रिंग शाब्दिक हैं और एक एकल "x" या "X" वर्ण से पहले हैं। ... एक शाब्दिक मूल्य भी टोकन "NULL" हो सकता है।


8
इसके अलावा, यदि बाध्य भाषा उन्हें समर्थन करती है (सबसे अधिक है, लेकिन SQLite शेल नहीं करता है) बाध्य मापदंडों का उपयोग करने पर विचार करें। SQL तब होगा INSERT INTO table_name (field1, field2) VALUES (?, ?)और मान सीधे (और प्रतिस्थापन के बिना) आपूर्ति की जाएगी।
डोनल फैलो

1
क्या हम सिर्फ दोहरे उद्धरण चिह्नों का उपयोग नहीं कर सकते? जैसे: INSERT INTO table_name (field1, field2) VALUES (123, "नमस्ते वहाँ"); ?
जैकसन एफ १

इसके अलावा, स्ट्रिंग के जीवनकाल के आधार पर, उन्हें फिर से दोगुना करने से पहले पहला कदम '' को '' में बदलना हो सकता है।
गैरी जेड

44

मेरा मानना ​​है कि आप एकल बोली को दोगुना करके बचना चाहेंगे:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

10

अपने स्ट्रिंग में सभी (') को बदलने के लिए, उपयोग करें

.replace(/\'/g,"''")

उदाहरण:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")

6

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

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

यह मेरे लिए सी # और जावा में काम करता है


0

C # में आप एकल उद्धरण को दोहरे उद्धरण के साथ बदलने के लिए निम्नलिखित का उपयोग कर सकते हैं:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

और उत्पादन होगा:

"St. Mary''s"

और, यदि आप सीधे स्क्लाइट के साथ काम कर रहे हैं; आप स्ट्रिंग के बजाय ऑब्जेक्ट के साथ काम कर सकते हैं और DBNull जैसी विशेष चीजों को पकड़ सकते हैं:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}

0

बैश लिपियों में, मैंने पाया कि मान के चारों ओर दोहरे उद्धरणों से बचना उन मूल्यों के लिए आवश्यक था जो शून्य या निहित वर्ण हो सकते हैं जिन्हें भागने की आवश्यकता होती है (जैसे हाइफ़न)।

इस उदाहरण में, स्तम्भ का मान शून्य हो सकता है या उसमें हाइफ़न हो सकते हैं।

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.