एक एकल डेटाबेस में कॉलम कोलनेशन को खराब क्यों माना जाता है?


11

दो कारण हैं जो मुझे यह सवाल पूछने के लिए प्रेरित करते हैं:

tSQLt
T-SQL परीक्षण ढाँचा tSQLt इसे "उच्च गंभीरता" का एक मुद्दा मानता है जब गैर-डिफ़ॉल्ट टकराव के साथ कॉलम मौजूद होता है। परीक्षण के लेखक निम्नलिखित बताते हैं:

मैं यह सुझाव नहीं दे रहा हूं कि प्रत्येक स्ट्रिंग कॉलम में एक कोलाजेशन होना चाहिए जो डेटाबेस के लिए डिफ़ॉल्ट कोलाजेशन से मेल खाता हो। इसके बजाय, मैं सुझाव दे रहा हूं कि जब यह अलग है, तो इसके लिए एक अच्छा कारण होना चाहिए।

फिर भी, असफल परीक्षण की गंभीरता, जैसा कि उल्लेख किया गया है, उच्च माना जाता है।

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

साइड-नोट के रूप में, RedGate का CI-टूल पैकेज, DLM ऑटोमेशन सूट , शिकायतों के बिना अलग-अलग कोलाजेशन के साथ तैनाती का समर्थन करता है।

डेटाबेस डिफ़ॉल्ट के लिए सभी कॉलम समतुल्य रखने की सिफारिश मेरे लिए दिशानिर्देश या सर्वोत्तम प्रथाओं की तरह अधिक लगती है। कुछ लोगों द्वारा इसे इतनी गंभीर त्रुटि क्यों माना जाता है?


आप SQL कॉप परीक्षणों के tSQLt अवतारों की बात कर रहे हैं। जैसे ही tSQLt परीक्षण पास या फेल होता है, इनको एक अनुशंसित डिफ़ॉल्ट की पेशकश करनी होती है। उपयोगकर्ताओं से पूरी तरह से अपेक्षा की जाती है कि वे SQLCop परीक्षणों को अपनी आवश्यकताओं के अनुसार अनुकूलित करें क्योंकि वे SQLCop स्कीमा में tSQLt फ्रेमवर्क द्वारा संग्रहीत प्रक्रियाओं से अधिक नहीं हैं।
डेविड एटकिन्सन

जवाबों:


19

डेटाबेस डिफ़ॉल्ट के लिए सभी कॉलम समतुल्य रखने की सिफारिश मेरे लिए दिशानिर्देश या सर्वोत्तम प्रथाओं की तरह अधिक लगती है।

आप यहां पूरी तरह से सही हैं।

कुछ लोगों द्वारा इसे इतनी गंभीर त्रुटि क्यों माना जाता है?

उसी कारण से जिसे आप अक्सर सुनते / पढ़ते होंगे कि "आपको कभी उपयोग नहीं करना चाहिए :"

  • कर्सर
  • GOTO बयान
  • SQLCLR
  • WITH (NOLOCK)
  • आदि, आदि

कुछ विशेषताएं / विकल्प / प्रौद्योगिकियां दूसरों की तुलना में अधिक जटिल हैं और आमतौर पर उपयोगकर्ता को अधिक ज्ञान की आवश्यकता होती है क्योंकि इसका उपयोग करते समय परेशानी में पड़ने की संभावना किसी भी समस्या के नहीं होने की संभावना से कहीं अधिक है। इसलिए, सामान्य लोगों के लिए ऐसी चीजों के खिलाफ सामान्यीकृत नियम रखना आसान है। वास्तव में, जब लिखाई काम पर "मानक कोडिंग", मैं हमेशा के लिए कोई नियम होगा कभी नहींCURSORs का उपयोग करें, फिर भी मैं उन्हें स्वयं उपयोग करता हूं क्योंकि मैं दोनों को जानता हूं कि "कब" उनका उपयोग करना है और "कैसे" उनका प्रभावी ढंग से उपयोग करना है। लेकिन जो लोग केवल कभी-कभार प्रश्न लिखते हैं, उनसे यह जानने की उम्मीद नहीं की जानी चाहिए। यह भी "रजिस्ट्री को संपादित न करें जब तक कि आप पूरी तरह से नहीं जानते कि आप क्या कर रहे हैं", या नियम जो हम अपने माता-पिता (बहुत छोटे) बच्चों के लिए माता-पिता के रूप में बनाते हैं, जहां हमें उन्हें केवल कुछ करने के लिए नहीं कहने की आवश्यकता है क्योंकि वे हैं किसी विशेष कार्य को करने के लिए या इसे करने के बारे में कैसे जाना ठीक है, इसकी जटिलताओं का पता लगाने में सक्षम नहीं है।

Collations के मामले में, यह एक बहुत ही जटिल और भ्रमित करने वाला विषय है, और आप दोनों हार्ड-एरर में भाग सकते हैं (ये एक मुद्दा है लेकिन किसी मुद्दे का कम है क्योंकि वे स्पष्ट हैं और इसलिए इसे ठीक करना काफी आसान है) और "विषम" में व्यवहार जहां यह समझाना कठिन है कि चीजें जिस तरह से काम कर रही हैं, वे (क्यों कुछ वस्तुओं को फ़िल्टर किया जाता है, या फ़िल्टर नहीं किया जाता है, अपेक्षाओं के बाहर, या क्यों छंटनी अपेक्षाओं से बाहर काम कर रही है)। और दुःख की बात यह है कि बड़ी मात्रा में गलत सूचनाएँ तैर रही हैं, जो बड़े पैमाने पर भ्रम पैदा करती हैं। मैं वास्तव में Collations और encodings, आदि के सामान्य ज्ञान को बढ़ाने के लिए एक परियोजना पर काम कर रहा हूं और गलत सूचना और मिथकों का मुकाबला करता हूं, लेकिन अभी तक इसे जारी करने के लिए तैयार नहीं है (जब मैं इसे इसके लिंक के साथ अपडेट करूंगा)।

Collation के लिए, आपको वह उपयोग करने की आवश्यकता है जो व्यावसायिक मामले के लिए सबसे अधिक समझ में आता है। किसी तालिका या डेटाबेस में Collations को नहीं मिलाने की धारणा एक डिफ़ॉल्ट दृष्टिकोण है, लेकिन यदि आप सिस्टम कैटलॉग दृश्यों के विभिन्न स्तंभों के लिए उपयोग किए गए Collations को देखते हैं, तो आप उपयोग किए जा रहे विभिन्न Collations को देखेंगे। इसलिए मैं इस प्रश्न में मुख्य उद्धरण से सहमत हूं कि यदि IF कोलेशन अलग होने जा रहे हैं, तो यह जानबूझकर होना चाहिए, लेकिन इसमें स्वाभाविक रूप से कुछ भी गलत नहीं है।


इस सवाल के संबंध में (जोर दिया गया):

ऑक्टोपस डिप्लॉय सर्वर को कॉन्फ़िगर करते समय, ऑक्टोपस सेवर-इंस्टेंस के आरंभ के दौरान सेटअप एक FATAL त्रुटि के साथ विफल हो जाता है। त्रुटि-संदेश से संबंधित लेख यह नहीं समझाता है कि यह एक आवश्यकता क्यों है

मैंने लिंक किए गए प्रलेखन पृष्ठ की जाँच की और यह वास्तव में समझाता है कि यह एक आवश्यकता क्यों है। मैंने नीचे उस दस्तावेज़ से प्रासंगिक जानकारी की प्रतिलिपि बनाई है:

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

वे कह रहे हैं कि ऑक्टोपस डेटाबेस में उनके कोड में स्ट्रिंग कॉलम के बीच जॉइन है और भविष्य के अपग्रेड में नए कोड को पेश करने की संभावना हो सकती है जिसमें नए स्ट्रिंग कॉलम पर अतिरिक्त जॉइन है । नए कॉलम, या तो के माध्यम से CREATE TABLEया ALTER TABLE ... ADD, डेटाबेस के डिफॉल्ट कोलेशन को असाइन किया जाएगा यदिCOLLATEनए स्ट्रिंग कॉलम के लिए कीवर्ड निर्दिष्ट नहीं किया गया था। और स्ट्रिंग कॉलम के बीच जोइन के समान Collation नहीं है वह Collation बेमेल त्रुटि उत्पन्न करेगा। वे उपयोगकर्ता को अपने स्वयं के Collation (संभवतः विभिन्न स्थानों को समायोजित करने के लिए) का चयन करने की अनुमति देते प्रतीत होते हैं क्योंकि वे शीर्ष पर कहते हैं कि एकमात्र आवश्यकता यह है कि Collation केस-असंवेदनशील हो। और डेटाबेस के Collation के बाद से उनके कोड रहता है कि हमेशा एक ही होने की गारंटी नहीं है, वे COLLATEसभी नए स्ट्रिंग कॉलम में एक ही Collation को मजबूर करने के लिए कीवर्ड का उपयोग नहीं कर सकते हैं (अच्छी तरह से, वे तकनीकी रूप से कर सकते हैं, लेकिन इसके लिए गतिशील की आवश्यकता होती है एसक्यूएल इतना आसान नहीं है जब अपडेट स्क्रिप्ट तैयार करते समय)। यदि वे COLLATEकीवर्ड का उपयोग करने में सक्षम थे , तो वे कर सकते थेडेटाबेस के डिफ़ॉल्ट Collation स्ट्रिंग स्तंभों से भिन्न होने के साथ दूर हो। यह कठिन "Collation मिसमैच" त्रुटियों से बचना होगा, लेकिन फिर भी उन स्ट्रिंग कॉलमों और स्ट्रिंग स्ट्रिंग शाब्दिक या चर में से एक से तुलनात्मक संचालन की संभावना को खुला छोड़ देगा, जिसके परिणामस्वरूप "विषम" व्यवहार होता है क्योंकि यह कॉलम के Collation का उपयोग करेगा और डेटाबेस का नहीं मिलान। बेशक, यह बहुत अच्छी तरह से अपेक्षित व्यवहार हो सकता है। लेकिन चूँकि यह एक 3 पार्टी ऐप है, व्यवहार ऐसा होना चाहिए, जो उपयोगकर्ता के बीच 50/50 के बजाय एक मौका हो, जो उपयोगकर्ता चाहता था (या उसे कोई आपत्ति नहीं थी) और बी) उपयोगकर्ता एक बग मानता है (और तब एक जंगली हंस पीछा और / या ब्लॉग के बारे में विक्रेता का समर्थन समय बर्बाद करता है कि उनका सॉफ्टवेयर कैसे छोटी है)।


हे, Collations के बारे में उस परियोजना पर कोई खबर?
यारोस्लाव

10

एक छोटे वाक्य पर: संकलन छँटाई और तुलना को परिभाषित करता है

तो, मिलान नियम एसक्यूएल सर्वर तुलना और तरह चरित्र डेटा का उपयोग करता है निर्धारित करता है। ये नियम भाषा / स्थानीय रूप से जागरूक हैं और केस, एक्सेंट, काना और चौड़ाई के प्रति संवेदनशील हो सकते हैं। Collation प्रत्यय शब्दकोश नियम (इन) संवेदनशीलता: _CS (केस संवेदनशील), _CI (केस असंवेदनशील), _AS (उच्चारण संवेदनशील), _AI (उच्चारण असंवेदनशील) और _KS (काना संवेदनशील) की पहचान करता है। प्रत्यय _BIN (बाइनरी) और _BIN2 (बाइनरी-कोड बिंदु) द्वारा पहचाने जाने वाले द्विआधारी टकराव सभी मामलों में संवेदनशील हैं।

विभिन्न टकराव निश्चित रूप से "टकराव का समाधान नहीं कर सकते हैं" त्रुटियों से बचने के लिए वर्कअराउंड की मांग करेंगे और ज्ञात गैर-व्यंग्य अभिव्यक्तियों के कारण प्रदर्शन को मार सकते हैं । विभिन्न टकरावों से निपटना एक दुःस्वप्न हो सकता है (इसलिए वहां है) इसलिए एक को चुनने और उसके साथ रहने की सिफारिश की गई है।

अधिक संदर्भ:


1

कई चीजों के साथ, SQL के पिछले संस्करणों में यह काफी महत्वपूर्ण समस्याएं पैदा कर सकता है। SQL7 / 2000 के इस लेख को देखें

SqlServerCentral Collation

अब इसकी बहुत अधिक मजबूत है, और ऐसी परिस्थितियां हैं, जहां अधिक आधुनिक प्रणालियों में इसका औचित्य है, लेकिन इसे बदलने के लिए अभी भी कुछ काफी दिलचस्प चेतावनी हैं।

यहां अधिक आधुनिक संस्करणों पर एक और उपयोगी श्रृंखला है। डैन गुज़मैन, जो मुझे लगता है कि यहाँ पर नियमित रूप से पोस्ट करता है, इसलिए वह जल्द ही पाइप कर सकता है :)

एसक्यूएल Collation नरक

संक्षेप में, संगतता, मानकीकरण और संभावित प्रदर्शन हिट मिश्रित टकराव का उपयोग नहीं करने के मुख्य कारण हैं।


0

टकरावों के बीच डेटा स्थानांतरित करना अगर nchar (16-bit) के बजाय char (8-बिट टेक्स्ट) हो तो डेटा बदल सकता है।

मुझे इस पृष्ठ https://the.agilesql.club/blogs/Blogs/Ed-Elliott/What-collation-variables-take-on-inT-SQL से विश्वास है कि जब एक चर एक पाठ से पाठ के साथ सौंपा गया है, तो यह है वर्तमान डेटाबेस के टकराव के रूप में स्पष्ट रूप से अनुवादित / माना जाता है। लेकिन जब आप किसी भिन्न डेटाबेस में जाते हैं तो चर में पाठ का क्या होता है? क्या उन बाइट्स को नए कोलाज में फिर से अनुवादित किया जाता है (यदि आवश्यक हो)?

मैंने "लैटिन" पत्र लहजे को हटाने और केवल ASCII पाठ को छोड़ने के लिए एक कोलाजेशन ट्रिक को उठाया, जिसकी मुझे आवश्यकता थी क्योंकि हमारे तीसरे पक्ष के सॉफ्टवेयर लहजे पर घुट रहे थे - मैंने पाठ को एक टकराव में डाल दिया जिसमें केवल ASCII और आधुनिक ग्रीक वर्णमाला है; Collate SQL_Latin1_General_CP1253_CI_AI। रोमन अक्षरों पर उच्चारण के लिए "स्लैन"! ;-)

लेकिन बुरी खबर अगर मैं उन्हें रखना चाहता था!

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