মাঠের নামগুলির চারপাশে ব্যাকটিক্স ব্যবহার করা


172

এখানে কয়েকটি এসকিউএল প্রশ্নে বেশ কয়েকটি উত্তর এবং মন্তব্য পড়ার পরে, এবং আমার বন্ধুটি এমন কোনও স্থানে কাজ করে যা শুনে তাদের নিষিদ্ধ করে, আমি ভাবছিলাম যে মাইএসকিউএল-এ ফিল্ডের নামগুলির চারপাশে ব্যাকটিক্স ব্যবহার করার ক্ষেত্রে কোনও সমস্যা আছে কিনা? ।

এটাই:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
ব্যাকটিক সত্যিই কুশলী যদি আপনি চান কলাম নামে করানোর বিষয়ে নিশ্চিত count, type, tableবা অনুরূপ
knittl


@knittl আমি মনে করি প্রশ্ন হচ্ছে, উচিত আপনার মত কলাম নাম আছে count, typeএবং table। এগুলি অত্যন্ত অস্পষ্ট শর্তাবলী এবং প্রায় প্রতিটি ক্ষেত্রেই এই নামগুলি আরও নির্দিষ্ট করে উন্নত করা যেতে পারে। আপনার কলামগুলির মতো জিনিসগুলির নামকরণও বিপজ্জনক এবং ত্রুটির একটি সম্ভাব্য উত্স, কারণ আপনি কখনই জানেন না যে কেউ কখন ব্যাকটিকগুলি যুক্ত করতে ভুলে যেতে পারে বা সেগুলি বুঝতে পারে না। আমি মনে করি কেবল কলামের নাম হিসাবে সংরক্ষিত পদ ব্যবহার করা এড়ানো ভাল অনুশীলন।
ডালিন

আমি এগুলি সর্বদা ব্যবহার করি এবং তাই আমি কোনও সময়ে সংরক্ষিত কীওয়ার্ড ব্যবহার করে বিপদে পড়ছি না।
মার্কাস জেলার

উত্তর:


153

ব্যাকটিক্স ব্যবহার করা আপনাকে বিকল্প চরিত্রগুলি ব্যবহার করার অনুমতি দেয়। ক্যোয়ারী লেখার ক্ষেত্রে এটি কোনও সমস্যা নয়, তবে যদি কেউ ধরে নেয় আপনি কেবল ব্যাকটিক ব্যবহার করতে পারেন তবে আমি ধরে নেব এটি আপনাকে হাস্যকর জিনিসগুলি দিয়ে দূরে সরিয়ে দেয়

SELECT `id`, `my name`, `another field` , `field,with,comma` 

যা অবশ্যই খারাপ নামযুক্ত টেবিল তৈরি করে।

যদি আপনি কেবল সংক্ষিপ্ত হয়ে থাকেন তবে আমি এটিতে কোনও সমস্যা দেখতে পাচ্ছি না, আপনি যদি আপনার কোয়েরিটি তেমন চালান তবে আপনি নোট করবেন

EXPLAIN EXTENDED Select foo,bar,baz 

উত্পন্ন সতর্কতাটি ফিরে আসবে এতে ব্যাক-টিক এবং সম্পূর্ণরূপে যোগ্যতাসম্পন্ন টেবিলের নাম থাকবে। সুতরাং আপনি যদি ক্যোয়ারী জেনারেশন বৈশিষ্ট্য এবং প্রশ্নগুলির স্বয়ংক্রিয় পুনঃলিখন ব্যবহার করছেন তবে ব্যাকটিকগুলি আপনার কোডকে বিশ্লেষণে কম বিভ্রান্ত করবে।

তবে আমি মনে করি, আপনি ব্যাকটিক্স ব্যবহার করতে পারেন কিনা তা জারি করার পরিবর্তে তাদের নামের জন্য একটি মান থাকা উচিত। এটি আরও 'আসল' সমস্যা সমাধান করে।


আমাদের কি পোস্টগ্রিজ এসকিউএল এ তাদের ব্যবহার করা দরকার?
ইউসুফ মেমন

5
কোনও প্রয়োজন নেই, কেবলমাত্র সুপারিশ। এসকিউএল কীওয়ার্ডগুলির সাথে অস্পষ্টতা এড়াতে তাদের উদ্ধৃত হওয়া উপস্থাপন করা দরকারী যদি ভবিষ্যতে, একটি এসকিউএল কীওয়ার্ড যুক্ত করা হয় যা আপনার ক্ষেত্রের নাম ভাগ করে দেয়। আপনার / প্রয়োজন / উদ্ধৃত করার একমাত্র সময় যখন ক্ষেত্র কোনও কীওয়ার্ডের নাম ভাগ করে , উদাহরণস্বরূপ, select count from fooবনাম select "count" from fooখুব আলাদা ফলাফল দেয়। তবে পোস্টগ্রিসগুলি মাইএসকিএল থেকে 2 উপায়ে পৃথক: 1. ক্ষেত্রগুলি উদ্ধৃত হয়েছে ""। ২. অব্যক্ত ক্ষেত্রগুলি হ'ল কেস সংবেদনশীল postgresql.org/docs/current/static/…
কেন্ট ফ্রেড্রিক

57

ব্যাকটিক্সগুলির সাথে একমাত্র সমস্যা হ'ল তারা এএনএসআই-এসকিউএল অনুগত নয়, যেমন তারা এসকিউএল সার্ভারে কাজ করে না।

যদি কোনও সুযোগ থাকে তবে আপনাকে আপনার এসকিউএলকে অন্য একটি ডাটাবেসে পোর্ট করতে হবে, ডাবল উদ্ধৃতি ব্যবহার করুন।


15
হাঁ। মাইএসকিউএল -এ ডাবল-কোটস সক্ষম করতে এবং এইভাবে ক্রস-ডাটাবেস সামঞ্জস্য ফিরে পেতে - মাইএসকিউএল এর এএনএসআই মোড ব্যবহার করুন dev ব্যাকটিকস / কোটগুলিও প্রয়োজনীয় কারণ ভবিষ্যতে ডিবিএমএস সংস্করণগুলিতে কী সংরক্ষিত শব্দ হয়ে উঠবে তা আপনি কখনই জানেন না।
বোবিনস

1
এটা খুব সত্য! আমরা আমাদের ডাটাবেস ইঞ্জিনটিতে একটি আপগ্রেড প্রয়োগ না করা পর্যন্ত আমাদের সার্ভারের একটি অ্যাপ্লিকেশন ঠিকঠাক চলছিল, যা একটি নতুন কীওয়ার্ড যুক্ত করেছে। হঠাৎ একটি বিশেষ টেবিলের অনুসন্ধানের সমস্ত কিছু ভেঙে গেল।
মিকুেলা

@ ববিন্স যখন আমি ডেভ নতুন ছিলাম, তখন আমি একটি কলাম rangeবা এর মতো কিছু রেখেছিলাম । আমরা যখন মাইএসকিউএল 5 এ আপগ্রেড করেছি তখন এটি ব্যর্থ হয়েছিল কারণ এটি একটি নতুন সংরক্ষিত শব্দ!
অ্যালেক্স

1
ডাবল উদ্ধৃতি ব্যবহার করবেন না। এটি সবসময় কাজ করবে না। উদাহরণস্বরূপ ... app_key_storesযেখান থেকে মুছে দিন ("কী" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); অনুসন্ধান ঠিক আছে, 0 টি সারি প্রভাবিত (0.00 সেকেন্ড) যেখান থেকে ডিলিট করুন app_key_stores( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); ক্যোয়ারী ওকে, 5 টি সারি প্রভাবিত (0.00 সেকেন্ড)
Altonymous

44

আমার কাছে ক্ষেত্রের নামগুলি ব্যবহার করার সময় এগুলি সর্বদা ব্যবহার করা অনেক অর্থবোধ করে।

  • প্রথমত, একবার আপনি অভ্যাসে উঠলে, ব্যাকটিক কীটি চাপলে আঘাত লাগে না।
  • দ্বিতীয়ত, আমার কাছে, আপনার ক্যোয়ারীর ক্ষেত্রগুলি হ'ল কী এবং কীওয়ার্ড বা পদ্ধতি কী তা দেখতে সহজ করে তোলে।
  • শেষ অবধি, এটি আপনাকে আপনার টেবিলটি ডিজাইনের সময় আপনি যে কোনও ক্ষেত্রের নামটি ব্যবহার করতে পারবেন। কখনও কখনও কোনও ক্ষেত্রের নাম "কী", "অর্ডার", বা "মানগুলি" রাখার পক্ষে এটি প্রচুর পরিমাণে বোঝা যায় ... যার সবকটির উল্লেখ করার সময় ব্যাকটিক্স প্রয়োজন।

19
আপনার আরও যোগ করা উচিত যে এটি ভবিষ্যতে যে কোনও সংরক্ষিত শব্দ ব্যবহার করা থেকে রক্ষা করে (যা আমাকে আগে কামড় দিয়েছে)।
অ্যালেক্স

5
আমার আসলে একবারে আমার একটি প্রশ্নের বাইরে কেউ অতিরিক্ত ব্যাকটিকগুলি সম্পাদনা করেছিল, যা আমাকে বিচলিত করে, যেহেতু এই কারণটিই আমি তাদের সাথে প্রতিটি পরিবর্তনশীলকে ঘিরে রাখার সঠিক কারণ
ব্রায়ান লেশম্যান

2
এটি অ অ ইংলিশ লেবেলের নিরাপদ ব্যবহারেরও অনুমতি দেয় যা ব্যাকটিক্স ব্যবহারকে উত্সাহিত করার জন্য একাই যথেষ্ট alone
আটারন্স

26

ব্যাকটিকগুলি স্ট্যান্ডার্ড এএনএসআই এসকিউএল এর অংশ নয়। থেকে MySQL ম্যানুয়াল :

যদি ANSI_QUOTES এসকিউএল মোড সক্ষম করা থাকে তবে এটি ডাবল উদ্ধৃতিতে সনাক্তকারীদের উদ্ধৃতি দেওয়ারও অনুমতিযোগ্য

সুতরাং আপনি যদি ব্যাকটিকগুলি ব্যবহার করেন এবং তারপরে মাইএসকিউএল থেকে সরে যাওয়ার সিদ্ধান্ত নেন তবে আপনার একটি সমস্যা রয়েছে (যদিও আপনার সম্ভবত আরও অনেক বড় সমস্যা রয়েছে)


9

আপনি যদি এমওয়াইএসকিউএল ব্যবহার করা চালিয়ে যান তবে কোনও সমস্যা নেই, কারণ সম্ভবত কোয়েরিগুলির ভিজ্যুয়াল ফুজানি। তবে তারা সারণী এবং কলামের নাম হিসাবে সংরক্ষিত কীওয়ার্ড বা এম্বেড থাকা স্পেস ব্যবহারের অনুমতি দেয়। এটি বেশিরভাগ ডাটাবেস ইঞ্জিনগুলির সাথে একটি নয় এবং পরবর্তী সময়ে কোনও স্থানান্তরকে আটকাবে।

সহজ পড়া হিসাবে, অনেক লোক এসকিউএল কীওয়ার্ডগুলির জন্য ক্যাপ ব্যবহার করেন, যেমন।

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

আপনি যদি আমাকে জিজ্ঞাসা করেন, ব্যাকটিক্স সবসময় ব্যবহার করা উচিত। তবে কিছু কারণ রয়েছে যে কোনও দল তাদের ব্যবহার না করা পছন্দ করে।

সুবিধাদি:

  • এগুলি ব্যবহার করে, কোনও সংরক্ষিত শব্দ বা নিষিদ্ধ অক্ষর নেই।
  • কিছু ক্ষেত্রে, আপনি আরও বর্ণনামূলক ত্রুটি বার্তা পান।
  • আপনি যদি খারাপ অভ্যাসগুলি এড়িয়ে যান তবে আপনার কোনও যত্ন নেই, তবে ... সত্য কথায়, কখনও কখনও এগুলি এসকিউএল ইঞ্জেকশনগুলি এড়ানোর একটি শালীন উপায়।

অসুবিধা:

  • এগুলি মানসম্পন্ন নয় এবং সাধারণত পোর্টেবল হয় না। তবে, যতক্ষণ না আপনি সনাক্তকারী হিসাবে অংশ হিসাবে ব্যাকটিক ব্যবহার করবেন না (যা আমি কল্পনা করতে পারছি এটি সবচেয়ে খারাপ অভ্যাস), আপনি স্বয়ংক্রিয়ভাবে ব্যাকটিকগুলি সরিয়ে নিজের জিজ্ঞাসাটি পোর্ট করতে পারেন।
  • যদি আপনার কোয়েরির কিছু অ্যাক্সেস থেকে আসে তবে তারা "(এবং সম্ভবত আপনি সমস্ত" অন্ধভাবে মুছে ফেলতে পারবেন না) দিয়ে সারণীর নামগুলি উদ্ধৃত করতে পারেন। তবে ব্যাকটিক্স এবং ডাবল কোটের মিশ্রণ অনুমোদিত।
  • কিছু বোকা সফ্টওয়্যার বা ফাংশন আপনার ক্যোয়ারী ফিল্টার করে এবং ব্যাকটিক্স নিয়ে সমস্যা রয়েছে। তবে এগুলি ASCII এর অংশ তাই এর অর্থ আপনার সফ্টওয়্যার / ফাংশনটি খুব খারাপ।

9
ব্যাকটিক্স ব্যবহারের এসকিউএল ইঞ্জেকশনগুলি এড়িয়ে যাওয়ার সাথে একেবারেই কিছু করার নেই।
অ্যান্ডি লেস্টার

6
@ এবং এটি সাহায্য করতে পারে, যেহেতু কোনও আক্রমণকারীকে ইঞ্জেকশনের জন্য অন্য ব্যাকটিক দিয়ে এটি বন্ধ করতে হবে। এটি সামান্য কিছু করে, তবে এটি এখনও কিছু
জেসনসভাও

4

ব্যাকটিক্সের কোনও কিছুর জন্য আপনার কোড-বেস অনুসন্ধান করা অনেক সহজ। বলুন আপনার একটি টেবিল আছে eventgrep -r "event" *শত শত ফলাফল ফিরে আসতে পারে। grep -r "\`event\`" *সম্ভবত আপনার ডাটাবেস রেফারেন্স কিছু দিতে হবে।


সাধারণভাবে এটি আসলে কোনও উপকার নয়। যে সমস্ত টেবিলগুলি পেশাদারভাবে আসে সেগুলির নাম "জেনারেল" এর চেয়ে আরও বেশি নতুন_উইসার_আইনফো হিসাবে দেওয়া হয়েছে।
ankush981

3

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


2

ব্যাকটিক সম্পর্কে সহজ জিনিস ` database_name মত বোঝাতে আইডেন্টিফায়ার, TABLE_NAME ইত্যাদি এবং একক উদ্ধৃতি জন্য ব্যবহার '' , ডবল উদ্ধৃতি " " যেমন হয় এবং মুদ্রণ মান জন্য স্ট্রিং লিটারেল জন্য, যেহেতু" "ব্যবহার '' মান পরিবর্তনশীল হোল্ড মুদ্রণ বা অন্য ক্ষেত্রে তার লেখাটি মুদ্রণ করুন।

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..

0

যদি আপনি কিছু ক্ষেত্রের নাম ডিফল্ট মাইএসকিএল বা এমএসকিউএল মান উদাহরণ হিসাবে "স্ট্যাটাস" ব্যবহার করেন তবে আপনাকে ব্যাকটিক্স ব্যবহার করতে হবে ("টেবিলের নাম statusথেকে নির্বাচন করুন " বা "টেবিলের নামটি যেখানে status= 1" নির্বাচন করুন)। কারণ mysql ত্রুটিগুলি ফিরিয়ে দেয় বা কোয়েরিতে কাজ করে না।


0

এসকিউএল-এ ব্যাকটিক্স (`) এর প্রধান ব্যবহার হ'ল আসন্ন ধারাগুলিতে আপনি আবার তাদের কল করতে যাচ্ছেন এমন পরিস্থিতিতে তাদের ব্যবহার করা। অন্য প্রতিটি সময়ে এটিতে ডাবল উদ্ধৃতি ("") ব্যবহার করার পরামর্শ দেওয়া হয়।

উদাহরণ স্বরূপ

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

উপরের বিবৃতিতে আপনি কীভাবে Publisher and Locationআবার GROUP BYধারাতে ব্যবহৃত হয় তা দেখতে পান ।

পরিবর্তে ব্যবহার

গ্রুপ, নাম, শহর, স্টেটকোড দ্বারা গ্রুপ

আমি স্রেফ ব্যবহার করেছি

গ্রুপ দ্বারা Publisher and Location

কেবল যখন এই ধরনের পরিস্থিতি দেখা দেয়, ব্যাকটিকগুলি ব্যবহার করা কার্যকর। অন্য সব সময়ে ডাবল উদ্ধৃতি ব্যবহার করার পরামর্শ দেওয়া হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.