วิธีใช้ MySQL DECIMAL


177

ฉันไม่สามารถเข้าใจถึงทศนิยมของ MySQL ได้ ฉันต้องการแถวเพื่อให้สามารถมีตัวเลขที่ใดก็ได้จาก 00.0001 ถึง 99.9999 ฉันจะจัดโครงสร้างให้ทำงานอย่างไร


8
(อ้างอิง) dev.mysql.com/doc/refman/5.1/en/…
Pekka

4
คุณควรยอมรับคำตอบที่ถูกต้องจริงๆ คำตอบที่ยอมรับในปัจจุบันนั้นผิด
Olhovsky

2
สิ้นสุดที่นี่และอ่านคำตอบที่อ้างว่าไม่สามารถลงนาม DECIMAL UNSIGNED ได้ ดูคำตอบใหม่ด้านล่างสำหรับข้อมูลจำเพาะที่ถูกต้องสำหรับสิ่งนี้
Markus AO

คำตอบ:


439

คอลัมน์ DOUBLE ไม่เหมือนกับคอลัมน์ DECIMAL และคุณจะพบปัญหาหากคุณใช้คอลัมน์ DOUBLE สำหรับข้อมูลทางการเงิน

DOUBLE เป็นจริงเป็นเพียงแค่ความแม่นยำสอง (64 บิตแทน 32 บิต) รุ่นFLOAT หมายเลขจุดลอยตัวเป็นตัวแทนโดยประมาณของจำนวนจริงและไม่แม่นยำ ในความเป็นจริงตัวเลขอย่างเช่น 0.01 ไม่มีการแทนค่าที่แน่นอนในประเภท FLOAT หรือ DOUBLE

คอลัมน์ DECIMAL เป็นการนำเสนอที่แน่นอน แต่ใช้พื้นที่มากขึ้นสำหรับช่วงที่มีจำนวนน้อยกว่ามาก ในการสร้างคอลัมน์ที่สามารถเก็บค่าได้ตั้งแต่ 0.0001 ถึง 99.9999 เช่นที่คุณถามคุณจะต้องมีข้อความสั่งต่อไปนี้

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

นิยามคอลัมน์ตามรูปแบบ DECIMAL (M, D) โดยที่Mคือจำนวนหลักสูงสุด ( ความแม่นยำ ) และDคือจำนวนหลักทางด้านขวาของจุดทศนิยม ( มาตราส่วน )

ซึ่งหมายความว่าคำสั่งก่อนหน้านี้สร้างคอลัมน์ที่ยอมรับค่าจาก -99.9999 ถึง 99.9999 นอกจากนี้คุณยังสามารถสร้างคอลัมน์ DECIMAL ที่ไม่ได้ลงนามตั้งแต่ 0.0000 ถึง 99.9999

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ MySQL DECIMAL เอกสารอย่างเป็นทางการเป็นแหล่งข้อมูลที่ดีเสมอ

โปรดทราบว่าข้อมูลทั้งหมดนี้เป็นจริงสำหรับ MySQL เวอร์ชัน 5.0.3 ขึ้นไป หากคุณใช้เวอร์ชั่นก่อนหน้านี้คุณควรอัพเกรด


17
โหวตคำตอบของคุณ คำตอบของคุณถูกต้องคำตอบอื่น ๆ ไม่ได้ (เนื่องจากมันอ้างว่า "double = ทศนิยม") DECIMAL เป็นประเภทจุดคงที่ที่มีค่าที่แน่นอนและคำพ้องความหมายคือ NUMERIC, DEC และ FIXED ไม่เป็นสองเท่าเนื่องจาก DOUBLE เป็นชนิดทศนิยมที่แสดงค่าข้อมูลตัวเลขโดยประมาณ เมื่อใช้ DECIMAL (<1-65>, <0-30>) พารามิเตอร์แรกคือจำนวนหลักและตัวเลขที่สองคือตัวเลขทางด้านขวาของจุดทศนิยม
Norbert

2
ใช่คุณถูก. จดบันทึกที่ใช้งานได้กับ MySQL 5.0.3 เป็นต้นไป, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
โปสเตอร์ขอเขตข้อมูลทศนิยมที่เก็บค่าระหว่าง 0.0001 ถึง 99.9999 ฉันเพิ่มข้อมูลพิเศษบางอย่างเพื่อชี้แจงว่าฟิลด์ที่สร้างขึ้นจริงรองรับค่าจาก -99.9999 ถึง 99.9999 ขอบคุณสำหรับความคิดเห็น! เพิ่มข้อจำกัดความรับผิดชอบเวอร์ชัน MySQL ด้วย
อเล็กซ์ Recarey

1
คุณพูดว่า "ไม่มีทางที่จะสร้างคอลัมน์" DECIMAL "ที่ไม่ได้ลงชื่อ" แต่ตัวอย่างรหัสของคุณระบุว่า "DECIMAL (6,4) UNSIGNED NOT NULL" ทำไมนี้
เหลียง

3
@AlexRecarey ฉันดูเหมือนจะสามารถสร้าง Decimal UNSIGNED ได้แล้ว และคู่มือการใช้งานสำหรับ MySQL 5.x DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]ตกลง: มันจะส่งคืนข้อผิดพลาดนอกช่วงสำหรับค่าลบ คุณสามารถสร้าง FLOAT และ DOUBLE ที่ไม่ได้ลงนามเช่นเดียวกัน คู่มือ: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO

67

แม้ว่าคำตอบข้างต้นดูเหมือนจะถูกต้อง แต่เป็นเพียงคำอธิบายง่ายๆเพื่อให้คุณเข้าใจว่ามันทำงานอย่างไร

สมมติว่าคอลัมน์ของคุณถูกตั้งค่าเป็น DECIMAL(13,4)สมมติว่าคอลัมน์ของคุณจะกำหนดซึ่งหมายความว่าคอลัมน์จะมีขนาดรวม 13 หลักโดยที่ 4 ของเหล่านี้จะใช้สำหรับการแสดงที่มีความแม่นยำ

ดังนั้นโดยสรุปสำหรับคอลัมน์นั้นคุณจะต้องมีค่าสูงสุด: 999999999.9999


1
คำตอบที่ดีที่สุดที่นี่
Julian Silvestri

15

มีวิธีแก้ไขที่ถูกต้องในความคิดเห็น แต่เพื่อสรุปพวกเขาเป็นคำตอบเดียว:

คุณต้องใช้ DECIMAL (6,4)

จากนั้นคุณสามารถมีตัวเลขทั้งหมด 6 หลัก 2 ก่อนและ 4 หลังจากจุดทศนิยม (มาตราส่วน) อย่างน้อยที่สุดก็เป็นไปตามนี้


6

ข้อกำหนด MySQL 5.x สำหรับประเภทข้อมูลทศนิยมคือ:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]สำหรับประเภทข้อมูลทศนิยมคือ:คำตอบข้างต้นเป็นความผิดในการบอกว่าไม่สามารถใช้ทศนิยมที่ไม่ได้ลงชื่อ

การกำหนดเขตข้อมูลที่ช่วยให้เพียงทศนิยมไม่ได้ลงนามที่มีความยาวรวมของ 6 หลัก 4 DECIMAL (6,4) UNSIGNEDแห่งซึ่งเป็นทศนิยมที่คุณจะใช้:

คุณสามารถสร้างประเภทข้อมูลที่ไม่ได้ลงนาม (เช่นไม่ใช่ลบ) ชนิดข้อมูลแบบลอยและแบบซ้อนได้

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