มีความแตกต่างระหว่าง DECIMAL และ NUMERIC ใน SQL Server หรือไม่?


127

มีความแตกต่างระหว่างชนิดข้อมูล DECIMAL และ NUMERIC ใน SQL Server หรือไม่

ฉันควรใช้ DECIMAL เมื่อใดและ NUMERIC เมื่อใด

คำตอบ:


105

พวกเขาก็เหมือน ๆ กัน. ตัวเลขมีฟังก์ชันเทียบเท่ากับทศนิยม

MSDN: ทศนิยมและตัวเลข


4
ความเท่าเทียมกันเชิงฟังก์ชันไม่เหมือนกับความเท่าเทียมกัน อันที่จริงในสไลด์ของผู้สอนของหลักสูตร MS6232A มีความคิดเห็นเพิ่มเติมว่าพวกเขาเกือบจะเหมือนกัน ในขณะเดียวกัน Microsoft ไม่มีคำแนะนำใด ๆ เกี่ยวกับข้อใดข้อหนึ่ง (อย่างไรก็ตาม DECIMAL มีความหมายมากกว่าเนื่องจากเป็นประเภทข้อมูลมาตรฐานแทนที่จะเป็นประเภทข้อมูลเดิมจาก Sybase) ยังคงสงสัยว่าความแตกต่างที่แท้จริง (หลังหน้าจอ) คืออะไร :-)
vstrien

22
@vstrien: ความแตกต่างเพียงอย่างเดียวที่ฉันสามารถหาที่อยู่ในมาตรฐาน SQL-92 decimalคือว่าเป็นที่แม่นยำตามที่ประกาศในขณะที่numericเป็นอย่างน้อยเป็นที่แม่นยำตามที่ประกาศ ใน SQL Server ทั้งสองมีความแม่นยำตรงตามที่ประกาศกล่าวคือไม่ได้ใช้ความยืดหยุ่นnumericที่มาตรฐานอนุญาต
Guffa

17
อย่างไรก็ตามโปรดทราบว่า SQL Server ไม่ถือว่าพวกเขาใช้แทนกันได้: ตัวอย่างเช่นหากคุณมีคอลัมน์ "พาเรนต์" ในรูปแบบ "DECIMAL (18,0)" และคุณพยายามเพิ่มคีย์ต่างประเทศที่อ้างอิงถึง คอลัมน์ในรูปแบบ "NUMERIC (18,0)" คุณจะได้รับข้อผิดพลาดColumn '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'ทั้งคู่ต้องเป็น NUMERIC (x, y) หรือทั้งคู่เป็น DECIMAL (x, y)
Doug_Ivison

7
@Guffa: คำตอบของคุณขัดแย้งกับมาตรฐาน SQL2003 ของตลาดที่stackoverflow.com/a/759606/14731 โดยเฉพาะdecimalเป็นอย่างน้อยเป็นที่แม่นยำตามที่ประกาศในขณะที่numericเป็นว่าเป็นที่แม่นยำตามที่ประกาศ
Gili

3
@ Gili: ใช่จากการตรวจสอบเนื้อหาต้นฉบับดูเหมือนว่าคุณคิดถูกที่ฉันเปลี่ยนมันไปรอบ ๆ
Guffa

41

นี่คือสิ่งที่มาตรฐาน SQL2003 (§6.1ประเภทข้อมูล) กล่าวเกี่ยวกับสองสิ่งนี้:

 <exact numeric type> ::=
    NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  | SMALLINT
  | INTEGER
  | INT
  | BIGINT

 ...

21) NUMERIC specifies the data type
    exact numeric, with the decimal
    precision and scale specified by the
    <precision> and <scale>.

22) DECIMAL specifies the data type
    exact numeric, with the decimal scale
    specified by the <scale> and the
    implementation-defined decimal
    precision equal to or greater than the
    value of the specified <precision>.

คุณมีลิงค์สำหรับสิ่งนี้หรือไม่?
gbn

2
Wiscorp มีเวอร์ชันร่างของมาตรฐานสำหรับดาวน์โหลด ( wiscorp.com/sql_2003_standard.zip ) หากคุณต้องการเวอร์ชันสุดท้ายคุณต้องซื้อ ( en.wikipedia.org/wiki/SQL2003#Documentation_availability )
Joakim Backman

6
โปรดทราบว่านี่เป็นมาตรฐาน SQL ไม่ใช่คำอธิบายว่า SQL Server ดำเนินการอย่างไร
Guffa

2
ยินดีที่ได้ทราบว่านี่เป็นอีกกฎหนึ่งที่ Microsoft ตัดสินใจละเว้น :)
one.beat.consumer

11

สำหรับความรู้ของฉันไม่มีความแตกต่างระหว่างประเภทข้อมูล NUMERIC และ DECIMAL มีความหมายเหมือนกันและสามารถใช้ได้อย่างใดอย่างหนึ่ง ประเภทข้อมูล DECIMAL และ NUMERIC เป็นประเภทข้อมูลตัวเลขที่มีความแม่นยำและมาตราส่วนคงที่

แก้ไข:

การพูดคุยกับเพื่อนร่วมงานบางคนอาจเกี่ยวข้องกับ DECIMAL ที่เป็นมาตรฐาน ANSI SQL และ NUMERIC ที่ Mircosoft ชอบเนื่องจากพบได้บ่อยในภาษาโปรแกรม ...อาจจะ ;)


Re the edit: Nope - ดูคำตอบของ @ JoakimBackman ด้านบน - เขาพูดถึงมาตรฐาน SQL ด้วยทั้ง NUMERIC และ DECIMAL
Reversed Engineer

1

เป็นคำพ้องความหมายไม่มีความแตกต่างกันเลยประเภทข้อมูลทศนิยมและตัวเลขเป็นข้อมูลประเภทตัวเลขที่มีความแม่นยำและมาตราส่วนคงที่

-- Initialize a variable, give it a data type and an initial value

declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed

-- Increse that the vaue by 1

set @myvar = 123456.7

--Retrieve that value

select @myvar as myVariable

1

คำตอบของ Joakim Backman นั้นเฉพาะเจาะจง แต่อาจทำให้เกิดความชัดเจนมากขึ้น

มีความแตกต่างเล็กน้อย ตาม SQL For Dummies ฉบับที่ 8 (2013):

ประเภทข้อมูล DECIMAL คล้ายกับ NUMERIC ... ความแตกต่างคือการนำไปใช้งานของคุณอาจระบุความแม่นยำมากกว่าที่คุณระบุหากเป็นเช่นนั้นการใช้งานจะใช้ความแม่นยำที่มากกว่า หากคุณไม่ได้ระบุความแม่นยำหรือมาตราส่วนการใช้งานจะใช้ค่าเริ่มต้นเช่นเดียวกับประเภท NUMERIC

ดูเหมือนว่าความแตกต่างในการใช้งาน SQL บางอย่างอยู่ที่ความสมบูรณ์ของข้อมูล DECIMAL อนุญาตให้โอเวอร์โฟลว์จากสิ่งที่กำหนดตามค่าเริ่มต้นของระบบบางอย่างโดยที่ NUMERIC ไม่ได้


-2

พวกเขาเหมือนกันทุกประการ เมื่อคุณใช้อย่างสม่ำเสมอ ใช้หนึ่งในฐานข้อมูลของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.