क्या NUMERIC और DECIMAL के बीच कोई अंतर है?


47

मुझे पता है कि SQL Server में NUMERIC और DECIMAL डेटा प्रकार समान काम करते हैं: उन्हें बनाने के लिए सिंटैक्स समान है, आपके द्वारा उन में संग्रहीत किए जा सकने वाले मानों की श्रेणी समान है, आदि।

हालाँकि, MSDN प्रलेखन दोनों के बीच के संबंध को इस प्रकार बताता है:

संख्यात्मक दशमलव के बराबर कार्यात्मक है।

आम तौर पर, जब मैं क्वालीफायर को " कार्यात्मक रूप से समतुल्य" देखता हूं , तो इसका मतलब है कि दो चीजें बिल्कुल समान नहीं हैं , लेकिन यह दो अलग-अलग प्रकार हैं जो बाहर से अप्रभेद्य हैं ।

क्या यह निहितार्थ सही है? क्या NUMERIC और DECIMAL के बीच मतभेद हैं जो सिर्फ एक बाहरी पर्यवेक्षक के समान व्यवहार करने के लिए होता है? या वे वास्तव में समतुल्य हैं, जैसे NUMERIC DECIMAL के लिए केवल एक विरासत पर्याय है?


1
आप SQL सर्वर के बाहर समर्थन में अंतर पा सकते हैं , उदाहरण के लिए मुझे SSIS में इस विषम अंतर से अवगत कराया गया था ।
हारून बर्ट्रेंड

जवाबों:


56

वे वास्तव में समान हैं, लेकिन वे स्वतंत्र प्रकार हैं, और तकनीकी रूप से समानार्थी शब्द नहीं हैं, जैसे ROWVERSIONऔर TIMESTAMP- हालांकि उन्हें एक समय में दस्तावेज में समानार्थक के रूप में संदर्भित किया गया हो सकता है । यह पर्यायवाची का थोड़ा भिन्न अर्थ है (उदाहरण के लिए वे नाम के सिवाय अविवेच्य हैं, न कि दूसरे के लिए एक उपनाम)। विडंबना, सही?

MSDN में शब्दांकन से मैं क्या व्याख्या करता हूं:

ये प्रकार समान हैं, उनके पास बस अलग-अलग नाम हैं।

के अलावा type_idमूल्यों, यहाँ सब एक समान हो:

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

मुझे दोनों के बीच किसी भी व्यवहार संबंधी मतभेदों का बिल्कुल भी ज्ञान नहीं है, और SQL सर्वर 6.5 पर वापस जाने पर, उन्हें हमेशा 100% विनिमेय माना जाता है।

DECIMAL (18,2) और NUMERIC (18,2) के लिए? एक दूसरे को सौंपना तकनीकी रूप से एक "रूपांतरण" है?

केवल अगर आप ऐसा स्पष्ट रूप से करते हैं। आप एक तालिका बनाकर और फिर स्पष्ट रूप से प्रदर्शन करने वाले प्रश्नों के लिए क्वेरी योजना का निरीक्षण करके - आपसे अपेक्षा कर सकते हैं - अंतर्निहित रूपांतरणों को आसानी से साबित कर सकते हैं। यहाँ एक सरल तालिका है:

CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

अब इन प्रश्नों को चलाएं और योजना पर कब्जा करें:

DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);

SELECT 
  CONVERT(DECIMAL(18,0), [num]), -- conversion
  CONVERT(NUMERIC(18,0), [dec])  -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec] 
  FROM dbo.NumDec WHERE [num] = @dec  -- no conversion
UNION ALL SELECT [num],[dec] 
  FROM dbo.NumDec WHERE [dec] = @num; -- no conversion

जैसा कि एसक्यूएल संतरी प्लान एक्सप्लोरर * में दिखाया गया है , योजना वास्तव में दिलचस्प नहीं है:

यहाँ छवि विवरण दर्ज करें

लेकिन एक्सप्रेशन टैब निश्चित है:

यहाँ छवि विवरण दर्ज करें

जैसा कि मैंने ऊपर टिप्पणी की, हमारे पास स्पष्ट रूपांतरण हैं जहां हमने उनके लिए कहा था, लेकिन कोई स्पष्ट रूपांतरण नहीं है जहां हम उनसे उम्मीद कर सकते हैं। लगता है कि अनुकूलक उन्हें विनिमेय भी मान रहा है।

आगे बढ़ो और इस परीक्षण की कोशिश करो, भी (डेटा और अनुक्रमित)।

CREATE TABLE [dbo].[NumDec2]
(
    [num] [numeric](18, 2) NULL,
    [dec] [decimal](18, 2) NULL
);

INSERT dbo.NumDec2([num],[dec])
SELECT [object_id] + 0.12, [object_id] + 0.12
  FROM sys.all_columns;

CREATE INDEX [ix_num] ON dbo.NumDec2([num]);
CREATE INDEX [ix_dec] ON dbo.NumDec2([dec]);

अब इस क्वेरी को चलाएं:

DECLARE @num NUMERIC(18,2) = -1291334356.88,
        @dec NUMERIC(18,2) = -1291334356.88;

SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = @num
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = @dec;

योजना का कोई रूपांतरण नहीं है (वास्तव में एक्सप्रेशन टैब खाली है):

यहाँ छवि विवरण दर्ज करें

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

SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @dec);

व्यक्तिगत रूप से, मैं इस शब्द का उपयोग करना पसंद करता हूं DECIMALक्योंकि यह बहुत अधिक सटीक और वर्णनात्मक है। BIT"संख्यात्मक" भी है।

* Disclaimer: I work for SQL Sentry.

मुझे पता है कि SQL व्यवहार करता है, उदाहरण के लिए DECIMAL (18,2) और DECIMAL (18,0) "विभिन्न प्रकार" के रूप में; क्या इसका अर्थ DECIMAL (18,2) और NUMERIC (18,2) के लिए समान है? एक दूसरे को सौंपना तकनीकी रूप से एक "रूपांतरण" है?
कुतुलुमाइक

@MichaelEdenfield आपके नए प्रश्न के लिए मेरा उत्तर अपडेट किया गया।
हारून बर्ट्रेंड

1
मुझे पता है कि यह एक पुराना उत्तर है, लेकिन मुझे सिर्फ एक मामला मिला है जिसमें यह सोचा गया है कि संख्यात्मक और दशमलव समानार्थी हैं क्योंकि SQL सर्वर त्रुटि पैदा करता है। बस मैंने सोचा कि मुझे यहाँ एक टिप्पणी छोड़ देनी चाहिए अगर कोई व्यक्ति इससे लाभान्वित हो सकता है।
ज़ोहर पेलेड

@AaronBertrand मैंने आपके उत्तर के लिए मतदान किया क्योंकि यह सहायक है। दोनों प्रकार समान दिखते हैं इसलिए यदि ऐसा है, तो उन्हें अलग नाम क्यों दिया गया है? क्या कोई ऐतिहासिक कारण है ?
इवानजिन्हो

@ इवानज़िन्हो मुझे यकीन नहीं है कि यदि आपका प्रश्न लफ्फाजी है, तो सिद्धांतों का एक गुच्छा है (इस पृष्ठ पर और आपके द्वारा जुड़े उत्तर दोनों), लेकिन यदि आप एक निश्चित उत्तर चाहते हैं, तो आप शायद भाग्य से बाहर होने जा रहे हैं। आपको मूल इंजीनियरों को ट्रैक करना होगा जिन्होंने पहले SQL सर्वर में दोनों प्रकारों को लागू किया था, और उस कार्यान्वयन की स्मृति और उस समय मानक की उनकी व्याख्या पर भरोसा करते हैं।
हारून बर्ट्रेंड

15

वे व्यवहार में समान हैं, हालांकि (SQL 2003 मानक से):

21) संख्यात्मक डेटा प्रकार सटीक सांख्यिक निर्दिष्ट करता है, दशमलव परिशुद्धता और बड़े पैमाने द्वारा निर्दिष्ट के साथ precisionऔर scale

22) DECIMAL डेटा प्रकार की सटीक संख्या को निर्दिष्ट करता है, जिसके द्वारा निर्दिष्ट दशमलव पैमाने scaleऔर कार्यान्वयन-परिभाषित दशमलव सटीक या निर्दिष्ट मान से अधिक है precision


5
तब मूलभूत प्रश्न (और मेरा मानना ​​है कि उत्तर नहीं है), क्या SQL सर्वर ने NIMERIC की तुलना में DECIMAL की सटीकता को लागू किया था। जो मानक कहा जा सकता है वह वास्तव में जो किया गया था, उससे कहीं कम प्रासंगिक है।
हारून बर्ट्रेंड

5
धन्यवाद। यह अनुवर्ती प्रश्न का एक उत्कृष्ट उत्तर है कि विभिन्न नामों के साथ दो प्रकार क्यों हैं लेकिन समान व्यवहार।
गेबे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.