फ़ील्ड नामों के आसपास बैकटीक्स का उपयोग करना

यहां कुछ एसक्यूएल प्रश्नों पर कुछ उत्तर और टिप्पणियां पढ़ने के बाद, और यह भी सुनकर कि मेरा एक दोस्त ऐसी जगह पर काम करता है जिसकी नीति है जो उन्हें प्रतिबंधित करती है, मैं सोच रहा हूं कि MySQL में फ़ील्ड नामों के आसपास बैकटिक्स का उपयोग करने में कुछ गड़बड़ है या नहीं ।

अर्थात्:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
0
यह भी देखें MySQL "> stackoverflow.com/questions/23446377/… में किसी तालिका या कॉलम नाम के रूप में आरक्षित शब्द का उपयोग करने के कारण" शीर्षक = "वाक्यविन्यास त्रुटि
जोड़ा लेखक Ian Ringrose, स्रोत
बैकटिक्स वास्तव में आसान हैं यदि आप count , type , table या समान जैसे कॉलम नाम रखना चाहते हैं
जोड़ा लेखक knittl, स्रोत

10 उत्तर

खैर, जहां तक ​​मुझे पता है, बैकटीक्स का उपयोग करने का पूरा उद्देश्य है ताकि आप उन नामों का उपयोग कर सकें जो आरक्षित कीवर्ड के साथ मेल खाते हैं। इसलिए, यदि नाम किसी आरक्षित कीवर्ड से टकरा नहीं रहा है, तो मुझे बैकटीक्स का उपयोग करने का कोई कारण नहीं दिखता है। लेकिन, उन पर प्रतिबंध लगाने का कोई कारण नहीं है, या तो।

0
जोड़ा

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

  • सबसे पहले, आदत में आने के बाद, यह बैकटिक कुंजी को हिट करने के लिए चोट नहीं पहुंचाता है।
  • दूसरा, मेरे लिए, यह देखना आसान बनाता है कि आपकी क्वेरी में फ़ील्ड वास्तव में क्या हैं, और कीवर्ड या विधियां क्या हैं।
  • आखिरकार, यह आपको अपनी तालिका को डिज़ाइन करते समय इच्छित फ़ील्ड नाम का उपयोग करने की अनुमति देता है। कभी-कभी यह फ़ील्ड "कुंजी", "ऑर्डर" या "मान" नाम देने के लिए बहुत अधिक समझ में आता है ... जिनमें से सभी को संदर्भित करते समय बैकटिक्स की आवश्यकता होती है।
0
जोड़ा
आपको यह भी जोड़ना चाहिए कि यह आपको इस्तेमाल किए जा रहे किसी भी भविष्य के आरक्षित शब्दों से बचाता है (जिसने मुझे पहले काट दिया है)।
जोड़ा लेखक alex, स्रोत
मैं वास्तव में किसी को अपने प्रश्न में से एक बार अतिरिक्त बैकटिक्स संपादित करता था, जो मुझे परेशान करता है, क्योंकि यही कारण है कि मैं उनके साथ हर चर को घेरता हूं
जोड़ा लेखक Brian Leishman, स्रोत
यह गैर अंग्रेजी लेबलों के सुरक्षित उपयोग की भी अनुमति देता है, जो अकेले बैकटीक्स के उपयोग को प्रोत्साहित करने के लिए पर्याप्त है।
जोड़ा लेखक Aternus, स्रोत

बैकटिक्स का उपयोग करने से आप वैकल्पिक पात्रों का उपयोग कर सकते हैं। प्रश्न लिखने में यह ऐसी समस्या नहीं है, लेकिन अगर कोई मानता है कि आप बैकटिक्स का उपयोग कर सकते हैं, तो मुझे लगता है कि यह आपको हास्यास्पद सामानों से दूर जाने देता है

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

जो निश्चित रूप से बुरी तरह से नामित टेबल उत्पन्न करता है।

यदि आप संक्षिप्त हैं तो मुझे इसके साथ कोई समस्या नहीं दिखाई देती है, यदि आप अपनी क्वेरी को इस प्रकार चलाते हैं तो आप ध्यान देंगे

EXPLAIN EXTENDED Select foo,bar,baz 

उत्पन्न होने वाली जेनरेट की गई चेतावनी में और पूरी तरह से योग्य तालिका नाम वापस आ जाएंगे। इसलिए यदि आप क्वेरी पीढ़ी की विशेषताओं का उपयोग कर रहे हैं और प्रश्नों के स्वचालित पुन: लेखन का उपयोग कर रहे हैं, तो बैकटिक्स आपके कोड को कम उलझन में कुछ भी कर देगा।

हालांकि, मुझे लगता है कि आप बैकटिक्स का उपयोग कर सकते हैं या नहीं, इसके बजाय उन्हें नामों के लिए मानक होना चाहिए। यह और अधिक 'वास्तविक' समस्याओं को हल करता है।

0
जोड़ा
क्या हमें PostgreSQL में भी उनका उपयोग करने की आवश्यकता है?
जोड़ा लेखक Yousuf Memon, स्रोत
कोई ज़रूरत नहीं है, केवल सिफारिश है। एसक्यूएल कीवर्ड के साथ अस्पष्टता से बचने के लिए उन्हें उद्धृत करने के लिए उपयोगी है, यदि भविष्य में, एक SQL कीवर्ड जोड़ा जाता है जो आपके फ़ील्ड नाम साझा करता है। एकमात्र समय जब आपको/आवश्यकता/उद्धरण देना है, तब एक क्षेत्र करता है एक कीवर्ड नाम साझा करता है, उदाहरण के लिए, foo से गणना करें बनाम foo से "गिनती" का चयन करें बहुत अलग परिणाम देगा। लेकिन postgres MySQL से 2 तरीकों से अलग है: 1. फ़ील्ड को "" द्वारा उद्धृत किया गया है। 2. अनगिनत फ़ील्ड केस असंवेदनशील हैं जोड़ा लेखक Kent Fredric, स्रोत

बैकिक्स मानक एएनएसआई एसक्यूएल का हिस्सा नहीं हैं। MySQL मैन्युअल से:

यदि ANSI_QUOTES SQL मोड है   सक्षम, यह उद्धरण भी स्वीकार्य है   डबल कोट्स के भीतर पहचानकर्ता

तो यदि आप बैकटिक्स का उपयोग करते हैं और फिर MySQL से दूर जाने का निर्णय लेते हैं, तो आपको एक समस्या है (हालांकि आपको शायद बहुत बड़ी समस्याएं भी हैं)

0
जोड़ा

बैकटीक्स के साथ एकमात्र समस्या यह है कि वे एएनएसआई-एसक्यूएल अनुपालन नहीं हैं, उदा। वे SQL सर्वर में काम नहीं करते हैं।

यदि कोई मौका है तो आपको अपने एसक्यूएल को दूसरे डेटाबेस में पोर्ट करना होगा, डबल कोट्स का उपयोग करें।

0
जोड़ा
@bobince जब मैं नया dev था, तो मैंने एक कॉलम रेंज या ऐसा कुछ नाम दिया। जब हमने MySQL 5 में अपग्रेड किया तो यह असफल रहा क्योंकि यह एक नया आरक्षित शब्द था!
जोड़ा लेखक alex, स्रोत
डबल कोट्स का प्रयोग न करें। यह हमेशा काम नहीं करेगा। उदाहरण के लिए ... 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, स्रोत
हां। MySQL के एएनएसआई मोड का उपयोग करें - dev.mysql.com/doc /refman/5.0/en/server-sql-mode.html - MySQL में डबल-कोट्स सक्षम करने के लिए और इस प्रकार क्रॉस-डेटाबेस संगतता प्राप्त करें। बैकटिक्स/उद्धरण भी जरूरी हैं क्योंकि आप भविष्य में डीबीएमएस संस्करणों में आरक्षित शब्द बनने के बारे में कभी नहीं जानते हैं।
जोड़ा लेखक bobince, स्रोत
ये बहुत सही है! हमारे सर्वर अनुप्रयोगों में से एक ठीक चल रहा था जब तक कि हम अपने डेटाबेस इंजन में अपग्रेड लागू नहीं करते, जिसमें एक नया कीवर्ड जोड़ा गया। अचानक एक विशेष तालिका पूछने वाली हर चीज टूट गई।
जोड़ा लेखक Miquella, स्रोत

अगर आप MYSQL का उपयोग करते रहें तो कुछ भी गलत नहीं है, सिवाय इसके कि प्रश्नों की दृश्यमानता को छोड़कर। लेकिन वे आरक्षित कीवर्ड या एम्बेडेड रिक्त स्थान का उपयोग टेबल और कॉलम नामों के रूप में करते हैं। यह अधिकांश डेटाबेस इंजनों के साथ नो-नो है और बाद में किसी भी माइग्रेशन को रोक देगा।

आसान पढ़ने के लिए, कई लोग एसक्यूएल कीवर्ड के लिए कैप्स का उपयोग करते हैं, उदाहरण के लिए।

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
0
जोड़ा

बैकटीक्स में कुछ के लिए अपने कोड-बेस को खोजना बहुत आसान है। मान लें कि आपके पास event नाम की एक तालिका है। grep -r "event" * सैकड़ों परिणाम लौटा सकता है। grep -r "\` event \ `" * शायद आपके डेटाबेस का संदर्भ देने वाली कुछ भी वापस कर देगा।

0
जोड़ा
आम तौर पर यह वास्तव में एक लाभ नहीं है। एक पेशेवर रूप से आने वाली टेबलों को "सामान्य" की तुलना में new_users_info की तरह नामित किया जाता है।
जोड़ा लेखक dotslash, स्रोत

यदि आप मुझसे पूछते हैं, बैकटिक्स हमेशा इस्तेमाल किया जाना चाहिए। लेकिन कुछ कारण हैं कि एक टीम उन्हें इस्तेमाल नहीं करना पसंद कर सकती है।

लाभ:

  • उनका उपयोग करके, कोई आरक्षित शब्द या वर्जित वर्ण नहीं हैं।
  • कुछ मामलों में, आपको अधिक वर्णनात्मक त्रुटि संदेश मिलते हैं।
  • यदि आप बुरे प्रथाओं से बचते हैं तो आपको परवाह नहीं है, लेकिन ... असली शब्द में, कभी-कभी वे एसक्यूएल इंजेक्शन से बचने के लिए एक सभ्य तरीका हैं।

Disलाभ:

  • वे मानक नहीं हैं और आमतौर पर पोर्टेबल नहीं हैं। हालांकि, जब तक आप पहचानकर्ता के हिस्से के रूप में बैकटिक का उपयोग नहीं करते हैं (जो कि सबसे खराब प्रथा है जिसे मैं कल्पना करने में सक्षम हूं), आप बैकटिक्स को स्वचालित रूप से हटाकर अपनी क्वेरी पोर्ट कर सकते हैं।
  • यदि आपकी कुछ क्वेरी एक्सेस से आती हैं, तो वे तालिका नामों को उद्धृत कर सकते हैं "(और हो सकता है कि आप सभी" अंधेरे से नहीं हटा सकें)। हालांकि, बैकटीक्स और डबल कोट्स के मिश्रण की अनुमति है।
  • कुछ बेवकूफ सॉफ़्टवेयर या फ़ंक्शन आपके प्रश्नों को फ़िल्टर करते हैं, और बैकटिक्स के साथ समस्याएं होती हैं। हालांकि, वे ASCII का हिस्सा हैं इसलिए इसका मतलब है कि आपका सॉफ़्टवेयर/फ़ंक्शन बहुत खराब है।
0
जोड़ा
@andy यह हो सकता है सहायता, क्योंकि किसी हमलावर को इंजेक्ट करने के लिए इसे किसी अन्य बैकटिक से बंद करना होता है। यह बहुत कम करता है, लेकिन यह अभी भी कुछ है
जोड़ा लेखक jasonszhao, स्रोत
बैकटिक्स का उपयोग करने से एसक्यूएल इंजेक्शन से बचने के लिए बिल्कुल कुछ नहीं है।
जोड़ा लेखक Andy Lester, स्रोत

यदि आप कुछ फ़ील्ड नामों का उपयोग डिफ़ॉल्ट MySQL या mssql मानों के उदाहरण के लिए "स्थिति" के रूप में कर रहे हैं, तो आपको बैकटिक्स का उपयोग करना होगा ("table_name से status चुनें" या "table_name से आईडी का चयन करें जहां status = 1 ")। क्योंकि MySQL त्रुटियों को देता है या क्वेरी काम नहीं करता है।

0
जोड़ा

बैकटिक के बारे में सरल बात `` डेटाबेस_नाम, 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
जोड़ा
अब ठीक है कृपया ध्यान से देखें ..
जोड़ा लेखक Sonpal singh Sengar, स्रोत