จะเก็บค่าทศนิยมใน SQL Server ได้อย่างไร?


272

ฉันพยายามหาชนิดข้อมูลทศนิยมของคอลัมน์ใน SQL Server ฉันต้องสามารถเก็บค่าเช่น 15.5, 26.9, 24.7, 9.8 ฯลฯ

ฉันกำหนดdecimal(18, 0)ให้กับชนิดข้อมูลคอลัมน์ แต่สิ่งนี้ไม่อนุญาตให้ฉันเก็บค่าเหล่านี้

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?

คำตอบ:


513

DECIMAL(18,0) จะอนุญาต 0 หลักหลังจุดทศนิยม

ใช้สิ่งที่ชอบDECIMAL(18,4)แทนที่ควรทำดี!

ที่ให้คุณมีทั้งหมด 18 หลัก 4 ซึ่งหลังจากจุดทศนิยม (และ 14 ก่อนจุดทศนิยม)


@marc_s มีการจัดเก็บค่า "4.5" หรือไม่ที่ประเภทข้อมูลคอลัมน์เป็นทศนิยม (4,2) เมื่อฉันใส่ค่ามันกำลังได้รับการแก้ไขเป็น "4.50"
Arun

1
@ArunkumarTK: decimal(4,2)อนุญาตให้มี 2 หลักก่อนและ 2 หลักหลังจุดทศนิยม "4.5" สามารถเก็บไว้ได้โดยไม่มีปัญหา - และตัวเลข "4.5" และ "4.50" เหมือนกัน
marc_s

3
@ArunkumarTK: ทำไมถึงแตกต่างกัน ?? ทั้งสองเป็น "สี่ครึ่ง" - ค่าเหมือนกันและห้ามใช้varcharเพื่อเก็บค่าทศนิยม !!
marc_s

1
ฉันรู้ว่านี่เป็นการสนทนาเก่า แต่จะไม่เป็น '4.05' และ '4.5' ในกรณีนี้ @ArunkumarTK
Shelby115

2
ใช่ว่าทำไมคือ 18 จึงเป็นที่นิยม (เช่นค่าเริ่มต้น (18,0)) เมื่อทั้ง 18 และ 19 การใช้งาน 9 ไบต์ ?
xr280xr

136

คุณควรใช้ดังนี้:

DECIMAL(m,a)

m คือจำนวนหลักทั้งหมดที่ทศนิยมของคุณสามารถมีได้

a คือจำนวนหลักสูงสุดที่คุณสามารถมีได้หลังจากจุดทศนิยม

http://www.tsqltutorials.com/datatypes.phpมีคำอธิบายสำหรับประเภทข้อมูลทั้งหมด


3
โดยปกติจะแสดงเป็น DECIMAL (p, s) โดยที่ p หมายถึงความแม่นยำ (ตัวเลขที่อนุญาตสูงสุดในตัวเลข) และ s ย่อมาจากมาตราส่วน (ตัวเลขสูงสุดที่อนุญาตหลังจุดทศนิยม)
RBT

ลิงค์นั้นตาย
อิบราฮิมมาห์รร์

43

การตั้งค่าสำหรับDecimalความแม่นยำและมาตราส่วนของมันหรือในภาษาปกติมีกี่ตัวเลขที่สามารถมีได้และคุณต้องการให้มีจำนวนหลักทางด้านขวาของจุดทศนิยม

ดังนั้นถ้าคุณใส่PIลงไปDecimal(18,0)มันจะถูกบันทึกเป็น3?

หากคุณใส่PIลงไปDecimal(18,2)ก็จะมีการบันทึกเป็น3.14?

หากคุณใส่PIลงในบันทึกเป็นDecimal(18,10)3.1415926535


35

ส่วนใหญ่ฉันใช้ทศนิยม (9,2) ซึ่งใช้พื้นที่เก็บข้อมูลน้อยที่สุด (5 ไบต์) ในรูปแบบทศนิยมของ sql


ความแม่นยำ => ไบต์การจัดเก็บข้อมูล

  • 1 - 9 => 5
  • 10-19 => 9
  • 20-28 => 13
  • 29-38 => 17

สามารถจัดเก็บได้ตั้งแต่ 0 ถึง 9 999 999.99 (หน้า 7 หลัก + 2 หลักหลังจุดทศนิยม = รวม 9 หลัก) ซึ่งใหญ่พอสำหรับค่าส่วนใหญ่


9

คุณสามารถลองสิ่งนี้

decimal(18,1)

ความยาวของตัวเลขควรมีทั้งหมด 18 ความยาวของตัวเลขหลังจุดทศนิยมควรเป็น 1 เท่านั้นและไม่มากกว่านั้น


6

ใน MySQL DB decimal(4,2)อนุญาตให้ป้อนตัวเลขได้เพียง 4 หลักเท่านั้น ดังที่คุณเห็นdecimal(4,2)นั่นหมายความว่าคุณสามารถป้อนตัวเลข 4 หลักซึ่งมีความหมายสองหลักสำหรับการรักษาหลังจากจุดทศนิยม

ดังนั้นหากคุณป้อน 100.0 ในฐานข้อมูล MySQL มันจะแสดงข้อผิดพลาดเช่น "นอกช่วงค่าสำหรับคอลัมน์"

ดังนั้นคุณสามารถเข้าสู่ช่วงนี้เท่านั้น: จาก 00.00 ถึง 99.99


2
เหตุใดจึงมีความเกี่ยวข้องในขณะที่คำถามที่ระบุไว้ชัดเจน Microsoft SQL Server
JCKödel

3

คำตอบอื่น ๆ ที่ถูกต้อง DECIMAL(3, 1)สมมติว่าตัวอย่างที่สะท้อนให้เห็นถึงคุณเต็มรูปแบบของความเป็นไปได้สิ่งที่คุณต้องการเป็น หรือDECIMAL(14, 1)จะอนุญาตทั้งหมด 14 หลัก มันเป็นงานของคุณที่จะคิดเกี่ยวกับสิ่งที่เพียงพอ


1
request.input("name", sql.Decimal, 155.33)              // decimal(18, 0)
request.input("name", sql.Decimal(10), 155.33)          // decimal(10, 0)
request.input("name", sql.Decimal(10, 2), 155.33)       // decimal(10, 2)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.