क्षेत्र के नामों के आसपास backticks का उपयोग करना


172

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

अर्थात्:

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

24
यदि आप कॉलम नाम जैसे , या समानcounttypetable
knittl


@knittl मुझे लगता है कि सवाल यह है कि, चाहिए तुम जैसे कॉलम नाम count, type, और table। वे भयानक अस्पष्ट शब्द हैं और लगभग हर मामले में उन नामों को और अधिक विशिष्ट बनाने के लिए सुधार किया जा सकता है। अपने स्तंभों को इस तरह नाम देना भी खतरनाक है और त्रुटियों का एक संभावित स्रोत है, जैसा कि आप कभी नहीं जानते हैं कि जब कोई बैकटिक्स जोड़ना भूल सकता है या महसूस नहीं करता है कि उन्हें करना है। मुझे लगता है कि कॉलम नामों के रूप में आरक्षित शब्दों का उपयोग करने से बचने के लिए यह बेहतर अभ्यास है।
dallin

मैं हमेशा उनका उपयोग करता हूं और इसलिए मैं किसी भी समय आरक्षित कीवर्ड का उपयोग करने से खतरे में नहीं हूं।
मार्कस ज़ेलर

जवाबों:


153

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

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

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

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

EXPLAIN EXTENDED Select foo,bar,baz 

वापस आने वाली उत्पन्न चेतावनी में बैक-टिक और पूरी तरह से योग्य टेबल नाम होंगे। इसलिए यदि आप क्वेरी जेनरेशन के फीचर्स और स्वचालित री-राइटिंग ऑफ क्वेरी का उपयोग कर रहे हैं, तो बैकटिक्स आपके कोड को कम उलझन में डाल देगा।

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


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

5
कोई जरूरत नहीं है, केवल सिफारिश। भविष्य में अगर SQL कीवर्ड के साथ अस्पष्टता से बचने के लिए उन्हें उद्धृत करने का प्रतिनिधित्व करना उपयोगी होता है, तो एक SQL कीवर्ड जोड़ा जाता है जो आपके खेतों का नाम साझा करता है। केवल समय आप / जरूरत / जब एक क्षेत्र के लिए उद्धरण है करता है उदाहरण के लिए, किसी कीवर्ड नाम साझा करते हैं, select count from fooबनाम select "count" from fooबहुत अलग परिणाम प्राप्त होंगे। लेकिन पोस्टग्रेज मायस्कल से 2 तरह से भिन्न होते हैं: 1. फील्ड्स द्वारा उद्धृत किया जाता है ""। 2. अछूते हुए फ़ील्ड केस असंवेदनशील हैं postgresql.org/docs/current/static/…
कैंट फ्रेड्रिक

57

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

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


15
हां। MySQL के ANSI मोड का उपयोग करें - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - MySQL में दोहरे उद्धरण चिह्नों को सक्षम करने के लिए और इस प्रकार क्रॉस-डेटाबेस संगतता को पुनः प्राप्त करें। Backticks / quotes भी आवश्यक हैं क्योंकि आप कभी नहीं जानते कि भविष्य के DBMS संस्करणों में आरक्षित शब्द क्या बनने जा रहा है।
बॉब

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

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

1
दोहरे उद्धरण चिह्नों का उपयोग न करें। यह हमेशा काम नहीं करेगा। उदाहरण के लिए ... DELETE FROM app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); क्वेरी ठीक है, 0 पंक्तियाँ प्रभावित (0.00 सेकंड) app_key_storesजहाँ से प्राप्त होती हैं ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); क्वेरी ठीक है, 5 पंक्तियाँ प्रभावित (0.00 सेकंड)
एल्टनमौस

44

मेरे लिए यह क्षेत्र के नाम के साथ काम करते समय हर समय उनका उपयोग करने के लिए बहुत मायने रखता है।

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

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

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

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

26

Backticks मानक ANSI SQL का हिस्सा नहीं हैं। से mysql मैनुअल :

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

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


9

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

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

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

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

लाभ:

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

नुकसान:

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

9
एसक्यूएल इंजेक्शन से बचने के लिए बैकटिक्स का उपयोग करने का कोई मतलब नहीं है।
एंडी लेस्टर

6
@ कैंडी इसकी मदद कर सकती है, क्योंकि एक हमलावर को इंजेक्शन लगाने के लिए इसे दूसरे बैकटिक के साथ बंद करना होगा। यह बहुत कम है, लेकिन यह अभी भी कुछ है
jasonszhao

4

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


सामान्य तौर पर यह वास्तव में एक लाभ नहीं है। पेशेवर रूप से आने वाली तालिकाओं को "सामान्य" की तुलना में अधिक new_users_info की तरह नाम दिया गया है।
अंकुश

3

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


2

बैकटिक के बारे में सिंपल बात `` का उपयोग डेटाबेस के लिए पहचानकर्ता_नाम, टेबल_नाम इत्यादि और सिंगल कोट '' , डबल कोट "" के लिए स्ट्रिंग लिटरल के लिए उपयोग किया जाता है, जबकि "" प्रिंट मूल्य के लिए उपयोग होता है और मान वेरिएबल होल्ड को प्रिंट करता है या " दूसरे मामले में उसके पास मौजूद टेक्स्ट प्रिंट करें।

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

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


0

SQL में backticks (`) का मुख्य उपयोग उन स्थितियों में उनका उपयोग करना है जहां आप उन्हें आगामी क्लॉज़ में फिर से कॉल करने जा रहे हैं। हर दूसरे समय में दोहरे उद्धरण चिह्नों ("") का उपयोग करने की सिफारिश की जाती है।

उदाहरण के लिए

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

जब ऐसी परिस्थितियां उत्पन्न होती हैं, केवल बैकटिक्स का उपयोग करना उपयोगी होता है। अन्य सभी समय में दोहरे उद्धरण चिह्नों का उपयोग करने की सिफारिश की जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.