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

ในบทความนี้ ฉันจะอธิบายความแตกต่างและความคล้ายคลึงระหว่างประเภทเหล่านี้ เพียงทำตาม.

1. บทนำ

ทั้ง NUMERICและ DECIMALเก็บเลขทศนิยมและใช้เลขคณิตที่แน่นอน ซึ่งต่างจากเลขทศนิยม (REAL, FLOAT ฯลฯ) ซึ่งเก็บเลขฐานสองและใช้เลขคณิตที่ไม่ตรงทั้งหมด ดังนั้น DECIMALหรือ NUMERIC ควรใช้สำหรับค่าเงิน ในขณะที่ตัวเลขทศนิยมควรใช้สำหรับการคำนวณทางวิทยาศาสตร์

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

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

มาดูไวยากรณ์และคำจำกัดความของประเภทให้ละเอียดยิ่งขึ้น

2. คำจำกัดความเชิงตัวเลข

ไวยากรณ์มีดังต่อไปนี้:

NUMERIC(p, s)

… ที่ไหน:

  • p = ความแม่นยำ หรือจำนวนหลักสูงสุดที่จะจัดเก็บ (รวมจุดทศนิยมทั้งสองด้านด้วย) ค่านี้ต้องอยู่ระหว่าง 1 ถึง 38 ค่าเริ่มต้นสำหรับ p คือ 18
  • s = สเกล หรือจำนวนหลักทางด้านขวาของจุดทศนิยม สามารถระบุได้เฉพาะเมื่อระบุความแม่นยำ (p) เท่านั้น ค่าเริ่มต้นคือ 0

ตัวอย่าง:

DECLARE @MyNumeric NUMERIC(6, 2)

ในที่นี้ความแม่นยำคือตัวเลขทั้งหมด 6 หลัก โดยมี 2 ทางด้านขวาของจุดทศนิยม ดังนั้น ตัวเลขที่ถูกต้องคือ 4162.34, 9245.12 ตัวเลขที่ไม่ถูกต้องคือ 10729.32 (แม้ว่าจะมี 2 ตัวเลขทางด้านขวาของจุดทศนิยม แต่ความแม่นยำคือ 7 แทนที่จะเป็น 6)

ช่วงของค่า NUMERICtype ที่สามารถจัดเก็บได้คือ -10³⁸+1 ถึง 10³⁸

3. คำจำกัดความทศนิยม

ไวยากรณ์คือ:

DECIMAL(p, s)

… ที่ไหน:

  • p = ความแม่นยำ แต่ จำนวนหลักสามารถมากกว่า p ได้
  • s = สเกล เหมือนกับสเกลที่ระบุไว้สำหรับ NUMERIC ทุกประการ

4. ตัวเลขและทศนิยมใน SQL Engine อื่นๆ

มาดูภาษา SQL บางภาษาและวิธีจัดการการแทนค่า DECIMAL และ NUMERIC กัน

MySQL

ใน MySQL นั้น NUMERICtype จะถูกนำไปใช้เป็น DECIMAL ดังนั้นจึงไม่จำเป็นต้องกังวลเกี่ยวกับความแม่นยำและความแตกต่างของขนาด

PostgreSQL

DECIMAL ได้รับการปฏิบัติเหมือนกับ NUMERIC ทุกประการ ความแม่นยำใน DECIMAL ต้องไม่มากกว่าที่ระบุ

ออราเคิล

Oracle มีประเภท DECIMAL และ NUMBER (ไม่ใช่ NUMERIC)

ไฟร์เบิร์ด

มีความแตกต่าง:

  • คำจำกัดความ NUMERIC หมายถึงความแม่นยำที่ร้องขออย่างแน่นอน
  • DECIMAL จะมีความแม่นยำที่ร้องขอ อย่างน้อย แต่อาจมีมากกว่านั้น (อย่างไรก็ตาม ตัวเลขทางด้านขวาของสัญลักษณ์ทศนิยมจะคงไว้อย่างถูกต้อง)