2008-11-04 12 views
146

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

यही कारण है:

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

बैकटिक वास्तव में काम करता है, तो आप 'count',' type', 'table' या इसी तरह – knittl

+0

यह भी देखना http://stackoverflow.com/questions/23446377/syntax-error- तरह कॉलम नाम करना चाहते हैं उपयोग-टू-यूज-ए-आरक्षित-शब्द-ए-ए-टेबल-या-कॉलम-नाम-इन-माइस्क्ल –

उत्तर

136

बैकटीक्स का उपयोग करके आप वैकल्पिक वर्णों का उपयोग करने की अनुमति देते हैं। क्वेरी लेखन में यह इस तरह एक समस्या नहीं है, लेकिन एक तुम सिर्फ बैकटिक उपयोग कर सकते हैं मान लिया गया है, मैं इसे आप हास्यास्पद सामान के साथ भाग की तरह

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

कौन सा निश्चित रूप से करता है बुरी तरह से नामित तालिकाओं उत्पन्न प्राप्त करने देता है ग्रहण करेंगे।

तुम सिर्फ संक्षिप्त जा रहा है कर रहे हैं मैं इसके साथ एक समस्या नहीं दिख रहा है, आप यदि आप इस तरह

EXPLAIN EXTENDED Select foo,bar,baz 

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

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

+0

क्या हमें PostgreSQL में भी उनका उपयोग करने की आवश्यकता है? –

+4

कोई आवश्यकता नहीं है, केवल सिफारिश है। एसक्यूएल कीवर्ड के साथ अस्पष्टता से बचने के लिए उन्हें उद्धृत करने के लिए उपयोगी है, यदि भविष्य में, एक SQL कीवर्ड जोड़ा जाता है जो आपके फ़ील्ड नाम साझा करता है। एकमात्र समय जब आपको/आवश्यकता/उद्धरण देने का समय होता है, तो फ़ील्ड _does_ एक कीवर्ड नाम साझा करता है, उदाहरण के लिए, 'foo' से' चुनिंदा "गिनती 'से गणना का चयन करें, बहुत अलग परिणाम देगा। लेकिन पोस्टग्रेस mysql से 2 तरीकों से अलग है: 1. फ़ील्ड को '' "द्वारा उद्धृत किया गया है। 2. अनगिनत फ़ील्ड केस असंवेदनशील हैं http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS –

4

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

41

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

  • सबसे पहले, आदत में आने के बाद, यह बैकटिक कुंजी को हिट करने में कोई दिक्कत नहीं करता है।
  • दूसरा, मेरे लिए, यह देखना आसान बनाता है कि आपकी क्वेरी में वास्तव में फ़ील्ड क्या हैं और कीवर्ड या विधियां क्या हैं।
  • आखिरकार, यह आपको अपनी तालिका को डिज़ाइन करते समय इच्छित फ़ील्ड नाम का उपयोग करने की अनुमति देता है। कभी-कभी यह फ़ील्ड "कुंजी", "ऑर्डर" या "मान" नाम देने के लिए बहुत अधिक समझ में आता है ... जिनमें से सभी को संदर्भित करते समय बैकटिक्स की आवश्यकता होती है।
+14

आपको यह भी जोड़ना चाहिए कि यह आपके द्वारा उपयोग किए जा रहे किसी भी भविष्य के आरक्षित शब्दों से बचाता है (जिसने मुझे पहले काट दिया है) । – alex

+5

मैं वास्तव में किसी एक बार मेरे प्रश्न में से एक से अतिरिक्त बैकटिक्स संपादित करता था, जो मुझे परेशान करता है, क्योंकि यही कारण है कि मैं उनके साथ हर चर को घेरता हूं –

+2

यह गैर अंग्रेजी लेबलों के सुरक्षित उपयोग की भी अनुमति देता है, जो अकेले पर्याप्त है बैकटीक्स के उपयोग को प्रोत्साहित करने के लिए। – Aternus

48

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

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

+13

हाँ। MySQL के एएनएसआई मोड का उपयोग करें - http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - MySQL में डबल-कोट्स सक्षम करने के लिए और इस प्रकार क्रॉस-डेटाबेस संगतता प्राप्त करें। बैकटिक्स/उद्धरण भी जरूरी हैं क्योंकि आप भविष्य में डीबीएमएस संस्करणों में आरक्षित शब्द बनने के बारे में कभी नहीं जानते हैं। – bobince

+1

यह बहुत सच है! हमारे सर्वर अनुप्रयोगों में से एक ठीक चल रहा था जब तक कि हम अपने डेटाबेस इंजन में अपग्रेड लागू नहीं करते, जिसमें एक नया कीवर्ड जोड़ा गया। अचानक एक विशेष तालिका पूछने वाली हर चीज टूट गई। – Miquella

+0

@ बॉबन्स जब मैं देव के लिए * नया * था, तो मैंने कॉलम 'रेंज' या ऐसा कुछ नाम दिया। जब हमने MySQL 5 में अपग्रेड किया तो यह असफल रहा क्योंकि यह एक नया आरक्षित शब्द था! – alex

20

बैकिक्स मानक एएनएसआई एसक्यूएल का हिस्सा नहीं हैं।the mysql manual से:

तो ANSI_QUOTES एसक्यूएल मोड सक्षम किया गया है, यह भी दोहरे उद्धरण चिह्नों

तो अगर आप बैकटिक का उपयोग और उसके बाद, MySQL से दूर स्थानांतरित करने का फैसला आप के भीतर पहचानकर्ता उद्धृत करने के लिए स्वीकार्य है

7

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL; 
6

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

+0

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

5

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

लाभ:

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

नुकसान:

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

बैकटिक्स का उपयोग करने से एसक्यूएल इंजेक्शन से बचने के लिए बिल्कुल कुछ नहीं है। –

+5

@andy it ** शायद ** मदद कर सकता है, क्योंकि एक हमलावर को इंजेक्ट करने के लिए इसे किसी अन्य बैकटिक से बंद करना होता है। यह बहुत कम करता है, लेकिन यह अभी भी कुछ है – jasonszhao

0

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

1

बैकटिक के बारे में सरल बात `` है 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

अब ठीक है कृपया ध्यान से देखें .. –

संबंधित मुद्दे