ฉันต้องการเก็บบันทึกจำนวนมากในฐานข้อมูล MySQL พวกเขาทั้งหมดมีค่าเงิน แต่ฉันไม่ทราบว่าจะใส่ตัวเลขจำนวนเท่าใดในแต่ละอัน
ฉันต้องใช้ข้อมูลชนิดใดเพื่อจุดประสงค์นี้
VARCHARหรือINT (หรือชนิดข้อมูลตัวเลขอื่น ๆ )?
ฉันต้องการเก็บบันทึกจำนวนมากในฐานข้อมูล MySQL พวกเขาทั้งหมดมีค่าเงิน แต่ฉันไม่ทราบว่าจะใส่ตัวเลขจำนวนเท่าใดในแต่ละอัน
ฉันต้องใช้ข้อมูลชนิดใดเพื่อจุดประสงค์นี้
VARCHARหรือINT (หรือชนิดข้อมูลตัวเลขอื่น ๆ )?
คำตอบ:
float
เนื่องจากเงินต้องการแสดงที่แน่นอนไม่ได้ใช้ชนิดข้อมูลที่มีเฉพาะตัวอย่างเช่น คุณสามารถใช้ชนิดข้อมูลตัวเลขคงที่สำหรับสิ่งนั้นได้
decimal(15,2)
15
คือความแม่นยำ (ความยาวทั้งหมดของค่ารวมถึงตำแหน่งทศนิยม)2
คือจำนวนหลักหลังจุดทศนิยมประเภทเหล่านี้จะใช้เมื่อมีความสำคัญในการรักษาความแม่นยำที่แน่นอนเช่นกับข้อมูลทางการเงิน
decimal
และnumeric
เหมือนกัน
numeric(19,4)
สำหรับบันทึกทางการเงินที่ให้มือที่ดีกว่าในการเล่นและรับคำขอใหม่ได้อย่างง่ายดาย
คุณสามารถใช้DECIMAL
หรือNUMERIC
ทั้งสองเหมือนกัน
ประเภท DECIMAL และ NUMERIC จะเก็บค่าตัวเลขที่แน่นอน ประเภทเหล่านี้จะใช้เมื่อมีความสำคัญในการรักษาความแม่นยำที่แน่นอนเช่นกับข้อมูลทางการเงิน ใน MySQL มีการใช้ NUMERIC เป็น DECIMAL ดังนั้นหมายเหตุเกี่ยวกับ DECIMAL ต่อไปนี้จะใช้กับ NUMERIC อย่างเท่าเทียมกัน : MySQL
กล่าวคือ DECIMAL(10,2)
ฉันชอบที่จะใช้BIGINT
และเก็บค่าโดยคูณด้วย 100เพื่อให้มันกลายเป็นจำนวนเต็ม
สำหรับตัวอย่างเช่นเพื่อแสดงค่าสกุลเงินของ93.49
ค่าจะถูกเก็บไว้เป็น9349
ในขณะที่แสดงค่าที่เราสามารถหารด้วย 100และแสดง สิ่งนี้จะใช้พื้นที่เก็บข้อมูลน้อยกว่า
ข้อควรระวัง:
ส่วนใหญ่เราจะไม่ทำการcurrency * currency
คูณในกรณีที่เราทำมันแล้วหารผลลัพธ์ด้วย 100 และเก็บเพื่อให้มันกลับไปสู่ความแม่นยำที่เหมาะสม
DECIMAL
? คุณสร้างความต้องการในการแปลเพนนีเป็นดอลลาร์และความฉิบหายถ้าคุณลืมมันในบางจุด
$0.005
หรือ$0.12345
) เพราะจะไม่ลดลงเป็นจำนวนเต็มหลังจากคูณด้วย 100 ถ้าคุณทราบความแม่นยำของค่าที่ชัดเจน DECIMAL
ตัวเลือกที่ดีที่สุดคือการใช้งาน แต่ถ้าคุณไม่รู้ความแม่นยำ (เหมือนในตัวอย่างของฉัน) แล้ว…จะFLOAT
เหมาะสมไหม
ขึ้นอยู่กับความต้องการของคุณ
การใช้DECIMAL(10,2)
มักจะเพียงพอ แต่ถ้าคุณต้องการค่าที่แม่นยำกว่าเล็กน้อยคุณสามารถตั้งค่าDECIMAL(10,4)
ได้
หากคุณทำงานกับค่าใหญ่แทนที่ด้วย10
19
หากแอปพลิเคชันของคุณต้องการจัดการกับค่าเงินสูงถึงล้านล้านสิ่งนี้ควรใช้: 13,2 ถ้าคุณจำเป็นต้องปฏิบัติตาม GAAP (หลักการบัญชีที่ยอมรับโดยทั่วไป) ให้ใช้: 13,4
โดยปกติคุณควรรวมมูลค่าเงินของคุณที่ 13,4 ก่อนที่จะปัดเศษผลลัพธ์เป็น 13,2
อันที่จริงสิ่งนี้ขึ้นอยู่กับความชอบของโปรแกรมเมอร์ ผมเองใช้: numeric(15,4)
เพื่อให้สอดคล้องกับหลักการบัญชีที่รับรอง ( GAAP )
ลองใช้
Decimal(19,4)
สิ่งนี้มักจะใช้ได้กับฐานข้อมูลอื่น ๆ ด้วย
double
เราใช้* * * * * * * * หอบ
เพราะมันสามารถเป็นตัวแทนใด ๆ จำนวน 15 หลักที่มีข้อ จำกัด ในการที่ไม่มีจุดทศนิยมคือ ทั้งหมดนี้มีขนาด 8 ไบต์!
ดังนั้นจึงสามารถเป็นตัวแทนของ:
0.123456789012345
123456789012345.0
... และทุกสิ่งในระหว่าง
สิ่งนี้มีประโยชน์เพราะเรากำลังเผชิญกับสกุลเงินทั่วโลกและdouble
สามารถเก็บจำนวนทศนิยมหลายตำแหน่งที่เราน่าจะพบ
double
เขตข้อมูลเดียวสามารถแสดงถึง 999,999,999,999,999s ในเยนญี่ปุ่น, 9,999,999,999,999.99s ในสกุลเงินดอลลาร์สหรัฐและแม้กระทั่ง 9,999,999.99999999s ใน bitcoins
หากคุณลองทำเช่นเดียวกันdecimal
คุณต้องมีdecimal(30, 15)
ค่าใช้จ่าย 14 ไบต์
แน่นอนว่าการใช้double
ไม่ได้โดยไม่มีคำเตือน
อย่างไรก็ตามมันไม่ได้สูญเสียความแม่นยำเนื่องจากบางคนมักจะชี้ให้เห็น แม้ว่าdouble
ตัวของมันเองอาจจะไม่ถูกต้องภายในระบบ 10 ฐานแต่เราสามารถทำให้แน่นอนโดยการปัดค่าที่เราดึงจากฐานข้อมูลไปยังตำแหน่งทศนิยมที่มีนัยสำคัญ หากจำเป็นนั่นก็คือ (เช่นถ้ามันจะถูกส่งออกและจำเป็นต้องมีการแทนฐาน 10)
คำเตือนคือเมื่อใดก็ตามที่เราทำการคำนวณทางคณิตศาสตร์เราจำเป็นต้องทำให้ผลลัพธ์เป็นปกติ (โดยปัดเศษเป็นทศนิยมที่มีนัยสำคัญ) ก่อน:
ชนิดของข้อแม้ก็คือแตกต่างจากdecimal(m, d)
ที่ฐานข้อมูลจะป้องกันไม่ให้โปรแกรมจากการใส่หมายเลขที่มีมากกว่าตัวเลขที่ไม่มีการตรวจสอบดังกล่าวอยู่ด้วยm
double
โปรแกรมสามารถใส่ค่าที่ป้อนเข้าของผู้ใช้เป็นตัวเลข 20 หลักและท้ายที่สุดจะถูกบันทึกอย่างเงียบ ๆ ว่าเป็นจำนวนที่ไม่ถูกต้อง
1.410000000000
(ทศนิยมสิบสองตำแหน่งที่มีนัยสำคัญ) แต่คูณด้วย 1,000,000,000,000 (ซึ่งเป็น 13 หลักสำคัญที่เหลือจุดทศนิยม) หมายความว่าเรากำลังทำงานด้วยที่ อย่างน้อย 25 หลักที่รวมกัน ไกลเกินกว่า 15 ที่มีอยู่สำหรับสองครั้งดังนั้นการออกแบบที่ชาญฉลาดฉันคิดว่ามันจะเสียมาก
ในช่วงเวลาที่ถูกถามคำถามนี้ไม่มีใครคิดเกี่ยวกับราคา Bitcoin ในกรณีของ BTC DECIMAL(15,2)
มันอาจจะไม่เพียงพอที่จะใช้งาน หาก Bitcoin จะเพิ่มขึ้นเป็น $ 100,000 หรือมากกว่านั้นเราจะต้องมีอย่างน้อยDECIMAL(18,9)
เพื่อรองรับการเข้ารหัสลับในแอพของเรา
DECIMAL(18,9)
ใช้พื้นที่ 12 ไบต์ใน MySQL ( 4 ไบต์ต่อ 9 หลัก )
การจัดเก็บเงินเป็นBIGINT
ทวีคูณ 100 หรือมากกว่าด้วยเหตุผลที่ใช้พื้นที่เก็บข้อมูลน้อยลงทำให้ไม่มีเหตุผลในทุกสถานการณ์ "ปกติ"
DECIMAL(13,4)
DECIMAL
หลักในการจัดเก็บ
DECIMAL(13,4)
แทนตัวเลข 9 หลัก + 4 หลัก (ตำแหน่งทศนิยม) => 4 + 2 ไบต์ = 6 ไบต์BIGINT
ไบต์จำเป็นต้องใช้ในการจัดเก็บหากต้องการ GAAP Compliance หรือคุณต้องการทศนิยม 4 ตำแหน่ง:
DECIMAL (13, 4) ซึ่งรองรับค่าสูงสุด:
$ 999,999,999.9999
มิฉะนั้นถ้าทศนิยม 2 ตำแหน่งเพียงพอ: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
เพิ่ม 10,000 และเก็บเป็น BIGINT เช่น "Currency" ใน Visual Basic และ Office ดูhttps://msdn.microsoft.com/en-us/library/office/gg264338.aspx
deimal(10,2)
คือสิ่งที่ฉันใช้ ... คุณสามารถปรับค่าได้ตามขนาดที่คาดหวัง