समस्या: डिफ़ॉल्ट DECIMAL राउंडिंग
जब DECIMAL कॉलम को स्केल (दशमलव स्थान) के बिना परिभाषित किया जाता है, तो MySQL पूर्णांक की तरह व्यवहार करता है और मानों को राउंड कर देता है।
समाधान: DECIMAL(precision, scale) निर्दिष्ट करें
DECIMAL(कुल_अंक, दशमलव_स्थान) में दोनों पैरामीटर निर्दिष्ट करें।
गलत: DECIMAL(7) - कोई स्केल नहीं
mysql> CREATE TABLE stopRoundingDemo (Amount DECIMAL(7)); mysql> INSERT INTO stopRoundingDemo VALUES (7836.783), (1737.67), (110.50); -- चेतावनी: Data truncated for column 'Amount' mysql> SELECT * FROM stopRoundingDemo; +--------+ | Amount | +--------+ | 7837 | | 1738 | | 111 | +--------+
मान राउंड हो गए!
सही: DECIMAL(10,4) - 4 दशमलव स्थान
mysql> CREATE TABLE stopRoundingDemo2 (Amount DECIMAL(10,4)); mysql> INSERT INTO stopRoundingDemo2 VALUES (7836.783), (1737.67), (110.50); -- कोई चेतावनी नहीं mysql> SELECT * FROM stopRoundingDemo2; +-----------+ | Amount | +-----------+ | 7836.7830 | | 1737.6700 | | 110.5000 | +-----------+
DECIMAL पैरामीटर समझाया
| सिंटैक्स | अर्थ | उदाहरण |
|---|---|---|
| DECIMAL(5,2) | कुल 5 अंक, 2 दशमलव | 999.99 तक |
| DECIMAL(10,4) | कुल 10 अंक, 4 दशमलव | 999999.9999 तक |
| DECIMAL(19,4) | मुद्रा के लिए सामान्य | 999 ट्रिलियन तक |
| DECIMAL(65,30) | अधिकतम MySQL सीमा | अत्यधिक सटीक |
महत्वपूर्ण नियम
- Precision (M): कुल अंकों की संख्या (1-65)
- Scale (D): दशमलव बिंदु के बाद के अंक (0-30, ≤ M)
- D = 0 या छोड़ा गया = पूर्णांक (राउंड होता है)
- भंडारण: लगभग M/2 बाइट्स
सर्वोत्तम अभ्यास
- मुद्रा/वित्तीय डेटा के लिए:
DECIMAL(19,4)याDECIMAL(10,2) - वैज्ञानिक माप के लिए: आवश्यक सटीकता के अनुसार
- कभी भी FLOAT/DOUBLE का उपयोग सटीक मानों के लिए न करें
- एप्लिकेशन स्तर पर भी सत्यापन करें
मौजूदा कॉलम ठीक करना
ALTER TABLE yourTable MODIFY COLUMN Amount DECIMAL(10,4);
नोट: डेटा पहले से राउंड हो चुका है तो खोया नहीं जा सकता।