2010-11-17 17 views
45

हम अपने ग्राहकों को एक उपकरण के साथ प्रदान करने जा रहे हैं (अन्य चीजों के साथ) एक नया SQL सर्वर डेटाबेस बनाता है, और मैं उनके द्वारा प्रदान किए गए डेटाबेस नाम पर मूल सत्यापन करने में सक्षम होना चाहता हूं। SQL सर्वर का दस्तावेज़ बताता है कि डेटाबेस नाम में कौन से वर्ण मान्य हैं। हालांकि, दस्तावेज़ीकरण स्पष्ट रूप से गलत है, क्योंकि मैं सफलतापूर्वक डेटाबेस बना सकता हूं जिनके नाम दस्तावेज़ित नियमों का उल्लंघन करते हैं।SQL सर्वर डेटाबेस नाम में कौन से वर्ण मान्य हैं?

CREATE DATABASE के लिए SQL सर्वर के दस्तावेज़ों के अनुसार, डेटाबेस नामों को पहचानकर्ताओं के नियमों का पालन करना होगा; और identifiers के नियम डेटाबेस संगतता स्तर पर निर्भर करते हैं। जब संगतता स्तर 100 है (जो, SQL सर्वर प्रबंधन स्टूडियो के अनुसार, "SQL Server 2008" का अर्थ है), नाम यूनिकोड अक्षर, _, @, या # से प्रारंभ होना चाहिए; इसके बाद एक या अधिक अक्षर, संख्याएं, @, $, #, या _। दस्तावेज़ीकरण स्पष्ट रूप से बताता है कि एम्बेडेड रिक्त स्थान या विशेष वर्णों की अनुमति नहीं है।

यह, उपलब्ध साक्ष्य का सामना करने में मक्खियों क्योंकि मैं एक डेटाबेस जिसका नाम This & That | "Other" है बनाने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर सकते हैं - जो न केवल शामिल एम्बेडेड रिक्त स्थान (स्पष्ट रूप से मना किया है), लेकिन विशेष वर्ण (|, ") जो कि एक फ़ाइल नाम में मान्य नहीं हैं। मैंने जांच की, और डेटाबेस की संगतता स्तर वास्तव में "SQL Server 2008 (100)" है, भले ही इसका नाम उस संगतता स्तर पर अमान्य होने के लिए प्रलेखित किया गया हो।

ओह, मैं भी CREATE DATABASE " " (हाँ, कि एक भी अंतरिक्ष) है, जो साबित करता है पहला वर्ण करता है कि नहीं अंडरस्कोर, एक पत्र होना जरूरी, हस्ताक्षर, या पाउंड चिह्न पर कर सकते हैं।

तो मुझे लगता है कि मेरा प्रश्न है, क्या हैं SQL सर्वर डेटाबेस नाम में मान्य है? क्या कोई दस्तावेज नियम हैं जो SQL सर्वर के वास्तविक व्यवहार के अनुरूप हैं?

+4

डेटाबेस, तालिका, आदि नाम के लिए अमान्य या अत्यंत असामान्य चरित्र (ओं) का उपयोग करने में क्या मूल्य है? यह सुनिश्चित करने के अलावा कि जो लोग आपके डेटाबेस का उपयोग करना चाहते हैं, उनका नाम शाप दें ... –

+2

यह तय करने के लिए उपयोगकर्ताओं पर निर्भर करेगा कि डेटाबेस को क्या कॉल करना है। अगर वे एक कुटिल नाम चुनना चाहते हैं, तो इस बिंदु पर मेरी समझ यह है कि हम उन्हें रोकना नहीं चाहते हैं। (यह बदल सकता है, लेकिन मैं कम से कम जानना चाहता हूं कि हमें क्या करना है।) –

उत्तर

26

अंत में rules for identifiers राज्य:

जब पहचानकर्ता Transact SQL कथन में किया जाता है, पहचानकर्ता कि इन नियमों का पालन नहीं करते दोहरे उद्धरण चिह्न या कोष्ठक द्वारा सीमांकित किया जाना चाहिए।

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

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

निम्नलिखित निर्देशों का ठीक हैं

CREATE DATABASE [conformingName] 
CREATE DATABASE conformingName 
CREATE DATABASE [This & That | "Other"] 

नहीं बल्कि

CREATE DATABASE This & That | "Other" 

संपादित करें:

मैं मानता हूँ कि यह कैसे एक जुड़ा हुआ प्रलेखन समझ नहीं है: क्या का पालन करना चाहिए करता है पहचानकर्ताओं के नियमों के साथ का अर्थ यह है कि यदि पहचानकर्ता संलग्न हो जाता है तो नियम अब लागू नहीं होते हैं? गैर अनुरूप पहचानकर्ताओं को घेरने के बारे में बिंदु नियमों का हिस्सा होना चाहिए।

+4

ठीक है, मैं देखता हूं। लेकिन दस्तावेज़ उन उद्धरणों के अंदर क्या मान्य है और मान्य नहीं हैं। क्या इसका मतलब है * कुछ भी * चला जाता है? अवैध यूनिकोड चरित्र? '\ 0'? या फिर भी नियम हैं? –

+5

इसे आजमाएं! हाँ, कुछ भी चला जाता है। मैंने ~ '^% $ £" नामक डेटाबेस नाम बनाया है, –

10

नियमित पहचानकर्ताओं और सीमित पहचानकर्ताओं के बीच एक अंतर है। एक नियमित पहचानकर्ता आपके द्वारा उल्लेख की गई सीमाओं से बंधे होते हैं, जबकि एक सीमित पहचानकर्ता में कोई वर्ण हो सकता है (डेलीमीटर को छोड़कर)।

जैसा कि आप पहचानकर्ता के चारों ओर उद्धरण चिह्नों का उपयोग कर रहे हैं, यह एक सीमित पहचानकर्ता है, और आप नियमित पहचानकर्ताओं के नियमों तक सीमित नहीं हैं।

सीमांकक के बिना आप केवल पहचानकर्ता है कि नियमित रूप पहचानकर्ता के नियमों का पालन के साथ डेटाबेस बना सकते हैं:

create database db_name 
सीमांकक के साथ

, तो आप काफी कुछ भी उपयोग कर सकते हैं:

create database "That's a funny name, isn't it?" 

create database [)(/%Q)/#&%¤)Q/#)!] 
+2

समझाएं * जबकि एक सीमांकित पहचानकर्ता में ** डिलीमीटर * को छोड़कर ** कोई अक्षर हो सकता है **। मैं इसे चरित्र से दो बार टाइप करने के लिए टाइप कर सकता हूं, जैसे: ** बनाएं डेटाबेस "" "" ** ** या यहां तक ​​कि ** डेटाबेस बनाते हैं []]] ** – Pacerier

+1

@Pacerier: हां, यदि सीमित पहचानकर्ता भागने का समर्थन करते हैं, तो आप पहचानकर्ता में भी डेलीमीटर का उपयोग कर सकते हैं। – Guffa

6

व्यक्तिगत तौर पर मैं सीमित हो जाएगी उन्हें वर्णमाला और संख्याओं के लिए और कुछ भी नहीं (अच्छी तरह से संभवतः एक _)। कोई जगह नहीं, कोई मजाकिया प्रतीक नहीं, कोई कैरिज रिटर्न इत्यादि नहीं है। यह सबसे सुरक्षित है जो आप कर सकते हैं।

+4

बिल्कुल समझ में नहीं आता है। वास्तव में यह कैसे सुरक्षित है? – Pacerier

+3

यह सच है कि डेटाबेस के विरुद्ध चल रही स्क्रिप्ट के मामले में यह सुरक्षित है जो विशेष वर्णों को ध्यान में नहीं ले सकता है। –

+7

@Pacerier, आप कभी नहीं जानते कि कौन सा सिस्टम या कोड आपके अजीब डेटाबेस नाम को संसाधित कर सकता है और उड़ाएं क्योंकि आपने वर्णों का उपयोग किया है, इसके डेवलपर को बहुत कम देखा गया था, भले ही SQL सर्वर उनके साथ ठीक हो। – ProfK

2

सीमित नाम - स्क्वायर ब्रैकेट या डबल कोट्स से घिरे हुए (यदि QUOTED_IDENTIFIER चालू है) - मूल रूप से स्वयं को डिलीमीटर के अलावा कुछ भी शामिल कर सकते हैं। कुछ भागने के तर्क के साथ नाम के भीतर delimiters का उपयोग करना भी संभव है। ध्यान दें कि यह केवल समापन से बचने वाला चरित्र है जिसे बच जाना चाहिए। नीचे दिए गए पहले उदाहरण में, नाम में शुरुआती भागने वाले चरित्र के एक उदाहरण को बचने की आवश्यकता नहीं है, जबकि समापन से बचने वाले चरित्र को बचाना होगा (एकल उदाहरण को दो के साथ बदलकर)। मुझे लगता है कि यहां तर्क यह है कि जो भी कोड इन बयानों को पार कर रहा है वह एक बंद बचने वाले चरित्र की तलाश में है और उसे नेस्टेड ओपनिंग से बचने वाले पात्रों में दिलचस्पी नहीं है।

  • [टेस्ट [टेस्ट] -> टेस्ट [टेस्ट
  • [टेस्ट]] टेस्ट] -> टेस्ट] टेस्ट

निम्नलिखित है आसपास के नियमों का एक विवरण गैर सीमांकित (nonquoted) SQL सर्वर 2012 में पहचानकर्ता नाम। यह दस्तावेज़ Guide to Migrating from MySQL to SQL Server 2012 से निकाला गया है।

स्कीमा ऑब्जेक्ट नाम

एसक्यूएल सर्वर 2012 में, एक वस्तु का नाम लंबे समय से अप करने के लिए 128 वर्ण हो सकता है।

Nonquoted पहचानकर्ता नाम इन नियमों का पालन करना होगा:

  • पहला वर्ण अल्फान्यूमेरिक होना चाहिए, एक अंडरस्कोर (_), चिह्न (@), या कोई संख्या चिह्न (#) में एक।
  • बाद के पात्रों में अल्फान्यूमेरिक वर्ण, अंडरस्कोर, एक (@) चिह्न, एक संख्या चिह्न, या एक डॉलर चिह्न शामिल हो सकता है।
  • पहचानकर्ता एक ट्रांजैक्ट-एसक्यूएल आरक्षित शब्द नहीं होना चाहिए। MySQL से SQL Server 2012 में माइग्रेट करने की मार्गदर्शिका 8
  • एम्बेडेड रिक्त स्थान या विशेष वर्णों की अनुमति नहीं है।

पहचानकर्ता जो @ या एक संख्या चिह्न से शुरू होते हैं, विशेष अर्थ हैं। स्थानीय वैरिएबल नाम @ से शुरू होने वाले पहचानकर्ता हैं। जो लोग संख्या संख्या के साथ शुरू करते हैं वे अस्थायी तालिका नाम हैं।

ट्रांजैक्ट-एसक्यूएल में पहचानकर्ता नाम उद्धृत करने के लिए, आपको वर्ग ब्रैकेट ([]) का उपयोग करना होगा।

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