มีข้อมูลสองประเภทที่แตกต่างกันที่ช่วยให้เราสามารถจัดเก็บข้อมูลตัวเลขที่แม่นยำใน SQL: NUMERIC
และ DECIMAL
ในบทความนี้ ฉันจะอธิบายความแตกต่างและความคล้ายคลึงระหว่างประเภทเหล่านี้ เพียงทำตาม.
1. บทนำ
ทั้ง NUMERIC
และ DECIMAL
เก็บเลขทศนิยมและใช้เลขคณิตที่แน่นอน ซึ่งต่างจากเลขทศนิยม (REAL, FLOAT ฯลฯ) ซึ่งเก็บเลขฐานสองและใช้เลขคณิตที่ไม่ตรงทั้งหมด ดังนั้น DECIMAL
หรือ NUMERIC
ควรใช้สำหรับค่าเงิน ในขณะที่ตัวเลขทศนิยมควรใช้สำหรับการคำนวณทางวิทยาศาสตร์
ทั้งสองประเภทนี้มีข้อโต้แย้งในเรื่องความแม่นยำและขนาด ความแม่นยำ คือจำนวนหลักทั้งหมดสูงสุดที่ตัวเลขสามารถมีได้ สเกล คือจำนวนหลักหลังจุดทศนิยม สำหรับหมายเลข 9167.142 ค่าความแม่นยำคือ 7 และสเกลคือ 3
ความแตกต่างหลักระหว่าง 2 ประเภทนี้คือวิธีจัดการกับค่าความแม่นยำ ในประเภทตัวเลข ค่าความแม่นยำจะคงที่ ซึ่งหมายความว่าคุณไม่สามารถเกินค่าความแม่นยำได้ ในทางกลับกัน ในรูปแบบทศนิยม คุณสามารถเกินค่าความแม่นยำได้ มันช่วยให้คุณมีความยืดหยุ่นในจำนวนค่าทั้งหมดที่คุณสามารถจัดเก็บได้
มาดูไวยากรณ์และคำจำกัดความของประเภทให้ละเอียดยิ่งขึ้น
2. คำจำกัดความเชิงตัวเลข
ไวยากรณ์มีดังต่อไปนี้:
NUMERIC(p, s)
… ที่ไหน:
p
= ความแม่นยำ หรือจำนวนหลักสูงสุดที่จะจัดเก็บ (รวมจุดทศนิยมทั้งสองด้านด้วย) ค่านี้ต้องอยู่ระหว่าง 1 ถึง 38 ค่าเริ่มต้นสำหรับ p คือ 18s
= สเกล หรือจำนวนหลักทางด้านขวาของจุดทศนิยม สามารถระบุได้เฉพาะเมื่อระบุความแม่นยำ (p) เท่านั้น ค่าเริ่มต้นคือ 0
ตัวอย่าง:
DECLARE @MyNumeric NUMERIC(6, 2)
ในที่นี้ความแม่นยำคือตัวเลขทั้งหมด 6 หลัก โดยมี 2 ทางด้านขวาของจุดทศนิยม ดังนั้น ตัวเลขที่ถูกต้องคือ 4162.34, 9245.12 ตัวเลขที่ไม่ถูกต้องคือ 10729.32 (แม้ว่าจะมี 2 ตัวเลขทางด้านขวาของจุดทศนิยม แต่ความแม่นยำคือ 7 แทนที่จะเป็น 6)
ช่วงของค่า NUMERIC
type ที่สามารถจัดเก็บได้คือ -10³⁸+1 ถึง 10³⁸
3. คำจำกัดความทศนิยม
ไวยากรณ์คือ:
DECIMAL(p, s)
… ที่ไหน:
p
= ความแม่นยำ แต่ จำนวนหลักสามารถมากกว่า p ได้s
= สเกล เหมือนกับสเกลที่ระบุไว้สำหรับNUMERIC
ทุกประการ
4. ตัวเลขและทศนิยมใน SQL Engine อื่นๆ
มาดูภาษา SQL บางภาษาและวิธีจัดการการแทนค่า DECIMAL
และ NUMERIC
กัน
MySQL
ใน MySQL นั้น NUMERIC
type จะถูกนำไปใช้เป็น DECIMAL
ดังนั้นจึงไม่จำเป็นต้องกังวลเกี่ยวกับความแม่นยำและความแตกต่างของขนาด
PostgreSQL
DECIMAL
ได้รับการปฏิบัติเหมือนกับ NUMERIC
ทุกประการ ความแม่นยำใน DECIMAL
ต้องไม่มากกว่าที่ระบุ
ออราเคิล
Oracle มีประเภท DECIMAL
และ NUMBER
(ไม่ใช่ NUMERIC
)
ไฟร์เบิร์ด
มีความแตกต่าง:
- คำจำกัดความ
NUMERIC
หมายถึงความแม่นยำที่ร้องขออย่างแน่นอน DECIMAL
จะมีความแม่นยำที่ร้องขอ อย่างน้อย แต่อาจมีมากกว่านั้น (อย่างไรก็ตาม ตัวเลขทางด้านขวาของสัญลักษณ์ทศนิยมจะคงไว้อย่างถูกต้อง)