CONVERT () के साथ इस समस्या का कारण क्या है?


12

निम्नलिखित दो कथनों पर विचार करें:

PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);

दोनों बयान वापस -1; यह गलत नहीं है क्योंकि दूसरा बाइनरी मान दशमलव 65,536 पहले मूल्य से अधिक है, क्या यह नहीं है?

निश्चित रूप से यह मौन छंटनी के कारण नहीं हो सकता है?

यदि मैं निम्नलिखित कथन चलाता हूं:

PRINT CONVERT(NUMERIC(38, 0),   0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0),   0x00010001, 0);

मुझे निम्नलिखित त्रुटि के साथ प्रस्तुत किया गया है:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.

मैं कैसे निदान कर सकता हूं कि यहां क्या हो रहा है?

मैं इसे SQL Server 2012, v11.0.5058 पर चला रहा हूं। परिणाम SQL Server 2008 R2 SP2, SQL Server 2005 और SQL Server 2000 पर समान हैं।


4
दशमलव और पूरी संख्या भिन्न रूप से भिन्न होती है। दशमलव में अधिक स्थान की आवश्यकता होती है। प्रयास करेंSELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
हारून बर्ट्रेंड

4
हारून हाजिर है। आपका मस्तिष्क द्विआधारी डेटा को पूर्णांक डेटा से सीधे संख्यात्मक में परिवर्तित कर रहा है, लेकिन SQL सर्वर द्विआधारी -> पूर्णांक -> संख्यात्मक (x, y) से यह अंतर्निहित रूपांतरण नहीं करता है। SQL सर्वर आपकी विचार प्रक्रिया का पालन करने के लिए, आपको कुछ इस तरह करना होगा PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);:।
थॉमस स्ट्रिंगर

5
पहला बाइट स्केल (0x01 = 1) है, दूसरा बाइट सटीक (0x00 = 0) है, अंतिम बाइट मान (0x01 = 1) है। सुनिश्चित नहीं हैं कि बाइट्स तीन और चार किस लिए हैं। संकेत वहाँ है, लेकिन दो बाइट्स की आवश्यकता नहीं है। निश्चित रूप से उस बिट को फ़्लिप करने से कुछ भी प्रभावित नहीं होता है।
मार्टिन स्मिथ

1
धन्यवाद, @ मर्टिनस्मिथ - पृथ्वी पर आपने कैसे निर्धारित किया कि पहले दो बाइट्स का उपयोग किया जाता है? क्या वह प्रलेखित है?
मैक्स वेरनॉन

3
@AaronBertrand: क्या आप इसका उत्तर देना चाहेंगे? हम इसे "अनुत्तरित" सूची से चिह्नित कर सकते हैं।
जॉन का ऑल ट्रेड्स

जवाबों:


2

दशमलव और पूरी संख्या भिन्न रूप से भिन्न होती है। दशमलव में अधिक स्थान की आवश्यकता होती है। प्रयत्न:

SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);

अपने अंतिम लक्ष्य के लिए, अंतरिक्ष को बचाने के लिए संपूर्ण संख्याओं को भिन्नता के रूप में संग्रहीत करना, मुझे लगता है कि आपने उस प्रश्न का उत्तर दिया है - इसके लायक नहीं।

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