एक्स्ट्रा कैरेक्टर्स के साथ यूनिक आइडेंटिफायर स्टिल सिलेक्टिंग मैचिंग


19

हम एक विशिष्ट पहचानकर्ता के साथ SQL सर्वर 2012 का उपयोग कर रहे हैं और हमने देखा है कि जब अतिरिक्त वर्णों के साथ चयन करते हैं तो अंत में जोड़ा जाता है (इसलिए 36 वर्ण नहीं) यह अभी भी एक यूयूआईडी के लिए एक मैच देता है।

उदाहरण के लिए:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

पंक्ति को uuid के साथ लौटाता है 7DA26ECB-D599-4469-91D4-F9136EC0B4E8

लेकिन अगर आप चलाते हैं:

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

यह पंक्ति को uuid के साथ भी लौटाता है 7DA26ECB-D599-4469-91D4-F9136EC0B4E8

एसक्यूएल सर्वर अपने चयन करते समय 36 से परे सभी पात्रों को अनदेखा करता है। क्या यह बग / सुविधा या कुछ ऐसा है जिसे कॉन्फ़िगर किया जा सकता है?

यह एक बहुत बड़ा मुद्दा नहीं है क्योंकि हमारे पास लंबाई के लिए सामने के छोर पर सत्यापन है, लेकिन यह मुझे सही व्यवहार नहीं लगता है।

जवाबों:


10

अंतर्निहित रूपांतरण भी काम करता है अगर मूल्य घुंघराले कोष्ठक में संलग्न है {...}

यदि आप क्वेरी में जोड़ते हैं तो अंतर्निहित रूपांतरण विफल हो जाएगा यदि मूल मूल्य बहुत लंबा है क्योंकि अंतिम }गलत स्थान पर समाप्त होता है।

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

यदि आप रूपांतरण की कोशिश करते हैं

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

आपको मिला

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

एसक्यूएल सर्वर अपने चयन करते समय 36 से परे सभी पात्रों को अनदेखा करता है। क्या यह बग / सुविधा या कुछ ऐसा है जिसे कॉन्फ़िगर किया जा सकता है?

इस प्रकार के लिए पुस्तकें ऑनलाइन प्रविष्टिuniqueidentifier में व्यवहार का दस्तावेजीकरण किया गया है :

BOL प्रविष्टि निकालें

उदाहरण के लिए कहा गया है:

बोल उदाहरण

यह कहा जा रहा है, मैं निहित रूपांतरणों से बचना पसंद करता हूं। uniqueidentifierODBC एस्केप सिंटैक्स का उपयोग करके एक शाब्दिक को सीधे T-SQL में टाइप किया जा सकता है:

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

यह वही सिंटैक्स SQL ​​सर्वर निष्पादन योजनाओं में आंतरिक रूप से उपयोग करता है जब एक स्ट्रिंग को लगातार टाइप करने के लिए एक स्ट्रिंग प्रतिनिधित्व uniqueidentifier:

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

सूचकांक यूडिड पर तलाश करते हैं

चाहे आप uniqueidentifiersSQL सर्वर से टाइप और पास कर सकते हैं, आपके द्वारा उपयोग की जा रही लाइब्रेरी पर निर्भर हो सकता है, लेकिन 36-वर्ण स्ट्रिंग्स मुझे उपलब्ध विकल्पों में से सबसे कम वांछनीय के रूप में प्रभावित करता है। यदि आप रूपांतरण करते हैं, तो उन्हें स्पष्ट करें, और स्ट्रिंग के बजाय 16-बाइट बाइनरी मान का उपयोग करें।


9

अतिरिक्त वर्णों को नजरअंदाज रूपांतरण के दौरान SQL सर्वर द्वारा आसानी से (अच्छी तरह से चुपचाप काट दिया जाता है) नजरअंदाज कर दिया जाता है। उदाहरण के लिए:

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

परिणाम:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

यह इस परिदृश्य के विपरीत नहीं है:

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

परिणाम:

----
x  

आप इसे कॉन्फ़िगर नहीं कर सकते, लेकिन यदि आप चाहते हैं कि आपका चर रूपांतरण में विफल हो जाए, तो आप चर को CHAR(36)पहले वाली तालिका में रखने की कोशिश कर सकते हैं , जो ट्रंकेशन के कारण विफल हो जाएगी:

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

परिणाम:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.