এসকিউএল কোয়েরিতে ব্যবহারের জন্য একক উদ্ধৃতি অক্ষরটি এড়িয়ে চলুন


179

আমি ডাটাবেস স্কিমা লিখেছি (এখন পর্যন্ত কেবল একটি টেবিল), এবং একটি ফাইলে সেই টেবিলের জন্য 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');

সমস্যাটি একটি একক উক্তিটির জন্য পালানোর চরিত্র। আমি একক উদ্ধৃতি ( \\\'পরিবর্তে ব্যবহার করে \') পালিয়ে যাওয়ার চেষ্টাও করেছিলাম , তবে এটি কার্যকর হয়নি। আমি কি ভুল করছি?

উত্তর:


293

একক উদ্ধৃতি দ্বিগুণ করার চেষ্টা করুন (অনেক ডাটাবেস সেভাবে প্রত্যাশা করে) তাই এটি হবে:

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

ডকুমেন্টেশন থেকে প্রাসঙ্গিক উক্তি :

একক উদ্ধৃতি (') এ স্ট্রিংটি বন্ধ করে একটি স্ট্রিং ধ্রুবক গঠিত হয়। স্ট্রালের মধ্যে একটি একক উদ্ধৃতি একক সারিতে দুটি একক উক্তি রেখে পাস্কেল-তে এনকোড করা যায়। ব্যাকস্ল্যাশ অক্ষর ব্যবহার করে সি-স্টাইল পলায়নগুলি সমর্থিত নয় কারণ তারা স্ট্যান্ডার্ড এসকিউএল নয়। বিএলওবি ল্যাটারালগুলি হেক্সাডেসিমাল ডেটাযুক্ত স্ট্রিং লিটারেল এবং এর আগে একটি "এক্স" বা "এক্স" অক্ষর থাকে। ... একটি আক্ষরিক মান টোকেন "NULL" হতে পারে।


8
এছাড়াও, হোস্ট ভাষা যদি তাদের সমর্থন করে তবে সীমাবদ্ধ প্যারামিটারগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন (বেশিরভাগ ক্ষেত্রে, তবে এসকিউএলাইট শেলটি না করে)। এসকিউএল তখন হবে INSERT INTO table_name (field1, field2) VALUES (?, ?)এবং মানগুলি সরাসরি সরবরাহ করা হবে (এবং বিকল্প ছাড়াই)।
ডোনাল ফেলো 20'13

1
আমরা কি কেবল ডাবল কোট ব্যবহার করতে পারি না? পছন্দ: টেবিলের নাম অন্তর্ভুক্ত করুন (ফিল্ড 1, ফিল্ড 2) ভ্যালু (123, "হ্যালো আছে"); ?
জ্যাকসঅনএফ 1

এছাড়াও, স্ট্রিংয়ের জীবদ্দশার উপর নির্ভর করে, প্রথম পদক্ষেপটি আবার দ্বিগুণ করার আগে '' তে রূপান্তর করা হতে পারে।
গ্যারি জেড

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

সি # তে আপনি ডাবল উদ্ধৃতি দিয়ে একক উদ্ধৃতি প্রতিস্থাপন করতে নিম্নলিখিতটি ব্যবহার করতে পারেন:

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

এবং আউটপুট হবে:

"St. Mary''s"

এবং, আপনি যদি স্ক্লাইটের সাথে সরাসরি কাজ করছেন; আপনি স্ট্রিংয়ের পরিবর্তে অবজেক্টের সাথে কাজ করতে পারেন এবং ডিবিএনল এর মতো বিশেষ জিনিসগুলি ধরতে পারেন:

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

0

ব্যাশ স্ক্রিপ্টগুলিতে, আমি দেখতে পেলাম যে মূল্যগুলি নাল হতে পারে বা এমন অক্ষর থাকতে পারে যাতে পালানোর প্রয়োজন হয় (হাইফেনের মতো) এর জন্য মানটির চারপাশে ডাবল উদ্ধৃতিগুলি পালানো প্রয়োজনীয় necessary

এই উদাহরণস্বরূপ, কলামএর মান শূন্য হতে পারে বা হাইফেন থাকতে পারে:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.