এসকিউএল কেস সংবেদনশীল। আমি মাইএসকিউএল এবং এসকিউএল সার্ভার ব্যবহার করেছি যা উভয়ই সংবেদনশীল বলে মনে হচ্ছে। এই সবসময় ক্ষেত্রে? স্ট্যান্ডার্ড কি কেস-সংবেদনশীলতা সংজ্ঞায়িত করে?
এসকিউএল কেস সংবেদনশীল। আমি মাইএসকিউএল এবং এসকিউএল সার্ভার ব্যবহার করেছি যা উভয়ই সংবেদনশীল বলে মনে হচ্ছে। এই সবসময় ক্ষেত্রে? স্ট্যান্ডার্ড কি কেস-সংবেদনশীলতা সংজ্ঞায়িত করে?
উত্তর:
এসকিউএল কীওয়ার্ড কেস-অবশ (হয় SELECT
, FROM
, WHERE
, ইত্যাদি), কিন্তু প্রায়ই সমস্ত বড় হাতের অক্ষরে লেখা হয়। তবে কিছু সেটআপে টেবিল এবং কলামের নামগুলি কেস-সংবেদনশীল। মাইএসকিউএল এটি সক্ষম / অক্ষম করার জন্য একটি কনফিগারেশন বিকল্প রয়েছে। সাধারণত লিনাক্স মাইএসকিউএল-তে কেস-সংবেদনশীল টেবিল এবং কলামের নামগুলি ডিফল্ট হয় উইন্ডোজে ডিফল্ট হিসাবে ব্যবহৃত হয়, তবে এখন ইনস্টলারটি সেটআপের সময় এটি সম্পর্কে জিজ্ঞাসা করেছিল। এমএসএসকিউএলের জন্য এটি ডাটাবেসের কোলেশন সেটিংয়ের একটি কাজ function
নামের কেস-সংবেদনশীলতা সম্পর্কে এখানে মাইএসকিউএল পৃষ্ঠা রয়েছে
SQL সার্ভারে এটি একটি বিকল্প । চোষার উপর এটি চালু।
আমি মাই এসকিএল সম্পর্কে নিশ্চিত নই।
সনাক্তকারী এবং সংরক্ষিত শব্দগুলি কেস সংবেদনশীল হওয়া উচিত নয়, যদিও অনেকে সংরক্ষিত শব্দের জন্য রাজধানী এবং শনাক্তকারীদের জন্য পাস্কেল কেস ব্যবহার করার জন্য একটি সম্মেলন অনুসরণ করে।
দেখুন এসকিউএল 92 সেকেন্ড। 5.2
SQL92 স্পেসিফিকেশন রাজ্যের শনাক্তকারী উদ্ধৃত যে হতে পারে, বা unquoted। যদি উভয় পক্ষই উদ্বিগ্ন থাকে তবে তারা সর্বদা কেস-সংবেদনশীল থাকে, যেমন table_name == TAble_nAmE
।
তবে উদ্ধৃত শনাক্তকারীরা কেস-সংবেদনশীল, যেমন "table_name" != "TAble_naME"
। এছাড়াও বৈশিষ্ট উপর ভিত্তি করে যদি আপনি উদ্ধৃত বেশী সঙ্গে unqouted শনাক্তকারী তুলনা করতে ইচ্ছুক, তাহলে unquoted এবং উদ্ধৃত শনাক্তকারী, একই বিবেচনা করা যেতে পারে যদি unquoted অক্ষর uppercased হয়, যেমন TABLE_NAME == "TABLE_NAME"
, কিন্তু TABLE_NAME != "table_name"
বা TABLE_NAME != "TAble_NaMe"
।
এখানে অনুমানের সম্পর্কিত অংশটি (বিভাগ 5.2.13):
13)A <regular identifier> and a <delimited identifier> are equiva-
lent if the <identifier body> of the <regular identifier> (with
every letter that is a lower-case letter replaced by the equiva-
lent upper-case letter or letters) and the <delimited identifier
body> of the <delimited identifier> (with all occurrences of
<quote> replaced by <quote symbol> and all occurrences of <dou-
blequote symbol> replaced by <double quote>), considered as
the repetition of a <character string literal> that specifies a
<character set specification> of SQL_TEXT and an implementation-
defined collation that is sensitive to case, compare equally
according to the comparison rules in Subclause 8.2, "<comparison
predicate>".
দ্রষ্টব্য, এটি এসকিউএল স্ট্যান্ডার্ডের অন্যান্য অংশগুলির মতো, সমস্ত ডাটাবেসই এই বিভাগটিকে পুরোপুরি অনুসরণ করে না। উদাহরণস্বরূপ পোস্টগ্রিএসকিউএল সমস্ত অনাকাঙ্ক্ষিত শনাক্তকারীকে বড় হাতের পরিবর্তে নিম্নতর করে রাখে, সুতরাং table_name == "table_name"
(যা আদর্শের ঠিক বিপরীত)। এছাড়াও কিছু ডাটাবেস সমস্ত সময় কেস-সংবেদনশীল থাকে, বা কেস-সংবেদনশীলতা ডিবিতে কিছু সেটিংয়ের উপর নির্ভর করে বা সিস্টেমের কয়েকটি বৈশিষ্ট্যের উপর নির্ভরশীল হয়, সাধারণত ফাইল সিস্টেমটি কেস-সংবেদনশীল কিনা।
নোট করুন যে কিছু ডাটাবেস সরঞ্জাম সর্বদা উদ্ধৃত শনাক্তকারী প্রেরণ করতে পারে, তাই আপনি যখন কোনও সরঞ্জাম দ্বারা উত্পন্ন প্রশ্নগুলি লিকুইবেস বা অন্যান্য ডিবি মাইগ্রেশন সরঞ্জাম দ্বারা তৈরি একটি তৈরি টেবিল ক্যোয়ারির মতো) একটি সাধারণ জেডিবিসি নির্বাচনের মতো নির্বাচন করুন might আপনার আবেদনে) আপনাকে অবশ্যই এটি নিশ্চিত করতে হবে যে মামলাগুলি সামঞ্জস্যপূর্ণ, বিশেষত ডাটাবেসে যেখানে উদ্ধৃত এবং অব্যক্ত শনাক্তকারী পৃথক (ডিবি 2, পোস্টগ্রিসকিউএল, ইত্যাদি)
আমার বোধগম্যতা হল যে এসকিউএল স্ট্যান্ডার্ড কেস-সংবেদনশীলতার জন্য কল করে। যদিও আমি বিশ্বাস করি না যে কোনও ডাটাবেসই পুরোপুরি মানটিকে অনুসরণ করে।
সংবেদনশীল বা সংবেদনশীল টেবিলের নামগুলির জন্য মাইএসকিউএলের "কড়া মোড" (মাইএসকিউএলকে আরও মান-সম্মতিযুক্ত করে তোলে এমন বেশ কয়েকটি সেটিংসের একটি ব্যাগ ব্যাগ) এর অংশ হিসাবে একটি কনফিগারেশন সেটিংস রয়েছে। এই সেটিংটি নির্বিশেষে, কলামের নামগুলি এখনও কেস-সংবেদনশীল, যদিও আমি মনে করি এটি কলাম-নামগুলি কীভাবে প্রদর্শিত হয় তা প্রভাবিত করে। আমি বিশ্বাস করি যে এই সেটিংটি আরডিবিএমএস ইনস্ট্যান্সের মধ্যে সমস্ত ডাটাবেস জুড়ে উদাহরণস্বরূপ, যদিও আমি এটি নিশ্চিত করার জন্য আজ গবেষণা করছি (এবং উত্তরটি উত্তর নেই বলে আশা করি)।
আমি পছন্দ করি কীভাবে ওরাকল এটিকে আরও ভালভাবে পরিচালনা করে। সোজা এসকিউএল-তে, টেবিল এবং কলামের নামগুলির মতো সনাক্তকারীরা সংবেদনশীল নয়। যাইহোক, যদি কোনও কারণে আপনি প্রকৃতপক্ষে সুস্পষ্ট কেসিং পেতে চান তবে আপনি সনাক্তকারীটিকে ডাবল-কোয়েটে (যা ওরাকল এসকিউএল-এ স্ট্রিং ডেটা বন্ধ করার জন্য ব্যবহৃত একক-কোটস থেকে বেশ আলাদা) বন্ধ করতে পারেন। তাই:
SELECT fieldName
FROM tableName;
অনুসন্ধান করবে FIELDNAME থেকে tablename কিন্তু
SELECT "fieldName"
FROM "tableName";
টেবিলের নাম থেকে ফিল্ডনেমকে জিজ্ঞাসা করবে ।
আমি নিশ্চিত যে আপনি শনাক্তকারীগুলিতে শূন্যস্থান বা অন্যান্য অ-মানক অক্ষর সন্নিবেশ করানোর জন্যও এই প্রক্রিয়াটি ব্যবহার করতে পারেন।
এই পরিস্থিতিতে যদি কোনও কারণে আপনি স্পষ্টভাবে কেসযুক্ত সারণী এবং কলামের নামগুলি দেখতে পান তবে এটি আপনার কাছে উপলব্ধ ছিল তবে এটি এখনও ছিল যা আমি খুব সাবধানতা অবলম্বন করব।
আমার কনভেনশন যখন আমি প্রতিদিন ভিত্তিতে ওরাকল ব্যবহার করতাম তা হ'ল কোডে আমি সমস্ত ওরাকল এসকিউএল কীওয়ার্ড বড় হাতের অক্ষরে এবং সমস্ত সনাক্তকারীকে ছোট হাতের মধ্যে রাখতাম would ডকুমেন্টেশনে আমি সমস্ত টেবিল এবং কলামের নাম বড় হাতের মধ্যে রাখতাম। এটি করতে সক্ষম হওয়ায় এটি খুব সুবিধাজনক এবং পাঠযোগ্য ছিল (যদিও অনেক সময় কোডে এতগুলি মূলধন টাইপ করতে ব্যথা হয় - আমি নিশ্চিত যে আমি এখানে একটি সম্পাদকীয় বৈশিষ্ট্য পেয়েছি, এখানে)।
আমার মতে মাইএসকিউএল বিশেষত বিভিন্ন প্ল্যাটফর্মে এই বিষয়ে পার্থক্যের জন্য খারাপ। আমাদের উইন্ডোজে ডাটাবেস ফেলে দিতে এবং সেগুলি ইউনিক্সে লোড করতে সক্ষম হওয়া দরকার, এবং উইন্ডোজ ইনস্টলার যদি আরডিবিএমএস কেস-সংবেদনশীল মোডে রাখতে ভুলে যায় তবে তা করা একটি বিপর্যয়। (সত্যি বলতে গেলে, এটির বিপর্যয়ের কারণটির অংশটি হ'ল আমাদের কোডাররা ইউনিক্স-এ মাইএসকিউএল-এর সংবেদনশীলতার উপর নির্ভর করার জন্য খারাপ সিদ্ধান্ত নিয়েছিল।) উইন্ডোজ মাইএসকিউএল ইনস্টলারটি লিখেছেন এমন লোকেরা এটিকে সত্যিই সুবিধাজনক এবং উইন্ডোজ-এর মতো, এবং লোকেরা একটি চেকবক্স দেওয়ার দিকে এগিয়ে যাওয়ার পক্ষে দুর্দান্ত ছিল "এই বলে আপনি কি কঠোর মোড চালু করে মাইএসকিউএলকে আরও মান-সম্মতিযুক্ত করতে চান?" তবে মাইএসকিউএল এর পক্ষে স্ট্যান্ডার্ডের থেকে লক্ষণীয়ভাবে পৃথক হওয়া খুব সুবিধাজনক, এবং তারপরে ঘুরিয়ে ঘুরিয়ে এবং বিভিন্ন প্ল্যাটফর্মের নিজস্ব ডি স্ট্যাক্ট মান থেকে পৃথক করে বিষয়গুলিকে আরও খারাপ করে তোলে। আমি নিশ্চিত যে ভিন্ন ভিন্ন লিনাক্স বিতরণে এটি আরও সংশ্লেষিত হতে পারে, কারণ বিভিন্ন ডিস্ট্রোর প্যাকেজকারীরা সম্ভবত তাদের নিজস্ব পছন্দসই মাইএসকিউএল কনফিগারেশন সেটিংস অন্তর্ভুক্ত করেছিলেন।
এখানে 'অন্য তাই প্রশ্ন যদি কেস-সংবেদনশীলতা একটি RDBMS মধ্যে কাঙ্ক্ষিত সেই আলোচনা মধ্যে পায় s।
মাইএসকিউএল কেস সংবেদনশীল নয় এবং এসকিউএল স্ট্যান্ডার্ডও নয়। কমান্ডগুলি আপার-কেস লিখতে কেবল সাধারণ অভ্যাস।
এখন, আপনি যদি টেবিল / কলামের নামগুলির বিষয়ে কথা বলছেন, তবে হ্যাঁ সেগুলি তবে সেগুলি নিজেরাই আদেশ নয়।
সুতরাং
SELECT * FROM foo;
হিসাবে একই
select * from foo;
তবে এর মতো নয়
select * from FOO;
আমি এই ব্লগ পোস্টটি খুব সহায়ক বলে মনে করেছি (আমি লেখক নই) সংক্ষিপ্তকরণ (দয়া করে পড়ুন, যদিও):
... সীমিত চিহ্নিতকরণগুলি কেস সংবেদনশীল ("টেবিল_নাম"! = "টেবিল_নাম") হয়, যখন অ-উদ্ধৃত শনাক্তকারী হয় না এবং এগুলি বড় আকারের (টেবিলের নাম => TABLE_NAME) এ রূপান্তরিত হয়।
তিনি পেয়েছেন ডিবি 2, ওরাকল এবং ইন্টারবেস / ফায়ারবার্ড 100% অনুগত:
পোস্টগ্র্যাস এসকিউএল ... বড় হাতের পরিবর্তে প্রতিটি অব্যক্ত শনাক্তকারীকে ছোট করে তোলে। মাইএসকিউএল ... ফাইল সিস্টেম নির্ভর। এসকিউএলাইট এবং এসকিউএল সার্ভার ... টেবিল এবং ক্ষেত্রের নামগুলি তৈরিতে সংরক্ষণ করা হয় তবে পরে সেগুলি সম্পূর্ণ উপেক্ষা করা হয়।
এসকিউএল কীওয়ার্ডগুলি নিজেরাই সংবেদনশীল।
সারণী, কলাম ইত্যাদির নামগুলির ক্ষেত্রে কেস সংবেদনশীলতা থাকে যা ডাটাবেস নির্ভর করে - আপনি সম্ভবত ধরে নিতে পারেন যে তারা অন্যথায় না জানলে এগুলি কেস সংবেদনশীল know নাম নেই)।
=,>, <ইত্যাদি ব্যবহার করে ডেটা তুলনা করার ক্ষেত্রে কেস সচেতনতা রয়েছে যা কোলেশন সেটিংসের উপর নির্ভর করে যা পৃথক ডাটাবেস, টেবিল বা প্রশ্নের মধ্যে থাকা কলামে ব্যবহার করা হয়। ডাটাবেসের মধ্যে কোলেশন মোটামুটি সুসংগত রাখা অবশ্য সাধারণ। আমাদের কয়েকটি কলাম রয়েছে যার ক্ষেত্রে কেস-সংবেদনশীল মান সংরক্ষণ করা দরকার; তাদের একটি কোলেশন নির্দিষ্টভাবে সেট করা আছে।
উভয় বিশ্বের সেরা আছে
এই দিনগুলিতে আপনি আপনার সমস্ত এসকিএল স্টেটমেন্টগুলি ছোট হাতের অক্ষরে লিখতে পারেন এবং যদি আপনার কখনও ফর্ম্যাট করতে হয় তবে কেবল একটি প্লাগইন ইনস্টল করুন যা এটি আপনার জন্য করবে। এটি কেবলমাত্র তখনই প্রযোজ্য যদি আপনার কোড সম্পাদকের সেই প্লাগইন উপলব্ধ থাকে। ভিএসকোডের অনেক এক্সটেনশন রয়েছে যা এটি করতে পারে।