MySQL में मनी वैल्यू स्टोर करने के लिए बेस्ट डेटा टाइप


279

मैं एक MySQL डेटाबेस में कई रिकॉर्ड स्टोर करना चाहता हूं। इन सभी में धन मूल्य समाहित है। लेकिन मुझे नहीं पता कि हर एक के लिए कितने अंक डाले जाएंगे।
इस उद्देश्य के लिए मुझे किस डेटा प्रकार का उपयोग करना है?
VARCHAR या INT (या अन्य संख्यात्मक डेटा प्रकार)?


13
deimal(10,2)मैं क्या उपयोग करता हूं ... आप अपेक्षित आकार के आधार पर मूल्यों को समायोजित कर सकते हैं
मानस

जवाबों:


370

चूंकि पैसे को एक सटीक प्रतिनिधित्व की आवश्यकता होती है, वे डेटा प्रकारों का उपयोग नहीं करते हैं जो केवल अनुमानित होते हैं जैसे float। आप उस तरह के लिए एक निश्चित-बिंदु संख्यात्मक डेटा प्रकार का उपयोग कर सकते हैं

decimal(15,2)
  • 15 सटीक (दशमलव स्थानों सहित कुल लंबाई की) है
  • 2 दशमलव बिंदु के बाद अंकों की संख्या है

देखें MySQL न्यूमेरिक प्रकार :

इन प्रकारों का उपयोग तब किया जाता है जब सटीक सटीकता को संरक्षित करना महत्वपूर्ण होता है, उदाहरण के लिए मौद्रिक डेटा के साथ ।


3
इस मामले के लिए दशमलव और संख्यात्मक डेटा प्रकार के बीच अंतर क्या हो सकता है?
एमिलियो गॉर्ट

60
MySQL में decimalऔर numericसमान हैं।
juergen d

21
मैं व्यक्तिगत numeric(19,4)रिकॉर्ड के लिए व्यक्तिगत रूप से उपयोग करता हूं जो आपको नए अनुरोधों को आसानी से खेलने और अपनाने के लिए बेहतर हाथ देता है।
याह्या जूल

10
मैं याह्या के साथ सहमत हूं, अधिक दशमलव बेहतर है। कुछ ऐसी मुद्राएं हैं जो आमतौर पर 3 दशमलव स्थानों का उपयोग करती हैं, जैसे बहरीन, जॉर्डन, या कुवैती दिनर, इसलिए आपको कम से कम 3. चार या पांच की आवश्यकता होती है।
एडविन हुगरेबीट्स

1
@EdwinHoogerbeets एक एकाउंटेंट नहीं होने के कारण ... लेकिन ब्रिटेन में एक छोटी सी बिज़ चलाने ... मुझे याद है कि बहुत समय पहले कहीं पढ़ा था कि मुद्रा के आंकड़ों को £ 4, $, आदि के लिए भी 4 डेसीमल तक संग्रहीत किया जाना चाहिए ताकि कुछ निश्चित गणना हो सके। वास्तव में कुछ अस्पष्ट लेखांकन संदर्भों के लिए अंतिम 2 दशमलव स्थानों का उपयोग करें। Wd को पुष्टि / खंडन करने के लिए एक लेखाकार की आवश्यकता है।
माइक कृंतक

88

आप उपयोग कर सकते हैं DECIMALया NUMERICदोनों समान हैं

DECIMAL और NUMERIC प्रकार सटीक संख्यात्मक डेटा स्टोर करते हैं। इन प्रकारों का उपयोग तब किया जाता है जब सटीक सटीकता को संरक्षित करना महत्वपूर्ण होता है, उदाहरण के लिए मौद्रिक डेटा के साथ। MySQL में, NUMERIC को DECIMAL के रूप में कार्यान्वित किया जाता है, इसलिए DECIMAL के बारे में निम्न टिप्पणी NUMERIC पर समान रूप से लागू होती है। : MySQL

अर्थात DECIMAL(10,2)

उदाहरण सेटिंग्स

अच्छा पढ़ा


3
शायद भ्रामक है, लेकिन आपका स्क्रीनशॉट आपके उत्तर पाठ (सटीक, स्केल) से मेल नहीं खा रहा है।
पैट्रिक हॉफमैन

मैं अपने पैसे के मूल्य के लिए दशमलव (10,2) का उपयोग कर रहा हूं, हालांकि जब मैं 867,000.00 की तरह कुछ डालता हूं तो यह 867 के रूप में बच जाता है। मैं क्या गलत कर रहा हूं?
कोडिनप्रोग्रेस

32

मैं BIGINTमानों का उपयोग करना चाहता हूं , और मानों को 100 से गुणा करना चाहता हूं , ताकि यह पूर्णांक बन जाए।

उदाहरण के लिए, मुद्रा मूल्य का प्रतिनिधित्व करने के लिए 93.49, मूल्य को संग्रहीत किया जाएगा 9349, जबकि मूल्य को प्रदर्शित करते हुए हम 100 से विभाजित कर सकते हैं और प्रदर्शित कर सकते हैं । यह कम संग्रहण स्थान पर कब्जा कर लेगा।

सावधानी:
ज्यादातर हम currency * currencyगुणन प्रदर्शन नहीं करते हैं , अगर हम ऐसा कर रहे हैं तो परिणाम को 100 और स्टोर के साथ विभाजित करें, ताकि यह उचित सटीकता पर वापस आ जाए।


मुझे याद है कि मेरे कंप्यूटर सिस्टम विश्वविद्यालय के एक प्रोफेसर ने एक ऐसी ही बात कही थी। मुझे सबसे सटीक तरीका सिखाया गया था कि पेनीज़ (या प्रतिशत) को 100 से गुणा करके और एक इंटिजर के रूप में सहेज कर और इसे प्रदर्शित करने के लिए 100 से विभाजित किया जाए। मुझे लगता है कि डेटाबेस प्रणाली की सटीकता और प्रदर्शन के संदर्भ में इसके लाभ हैं।
लंदनऐपडेव

11
फायदा क्या हुआ DECIMAL? यदि आप किसी बिंदु पर इसे भूल जाते हैं, तो आप पेनी को डॉलर में अनुवाद करने की आवश्यकता पैदा करते हैं।

1
अंतरिक्ष ही एकमात्र लाभ है, लेकिन हाँ जब हमें इस सुविधा का उपयोग कर रहे हैं तो हमें अधिक सावधान रहने की आवश्यकता है।
दिनेश PR

4
यदि यह स्पष्ट नहीं है तो: स्केल रिमूवल विधि का उपयोग करने से सावधान रहें यदि आप भिन्नात्मक सेंट (जैसे, $0.005या $0.12345) में पैसा स्टोर करते हैं क्योंकि वे 100 से गुणा करने के बाद एक पूर्णांक तक कम नहीं होंगे। यदि आप जानते हैं कि मूल्यों की सटीकता यह स्पष्ट है उपयोग करने के लिए सबसे अच्छा विकल्प है DECIMAL। लेकिन अगर आप सटीक (मेरे उदाहरणों में) नहीं जानते हैं तो ... FLOATउचित होगा ?
क्विन कंटेंडर

1
इस पद्धति का एक फायदा तब होता है जब जावास्क्रिप्ट जैसी भाषा का उपयोग किया जाता है जो फ्लोटिंग पॉइंट संख्याओं को संग्रहीत करने के लिए IEEE-754 का उपयोग करता है। यह विनिर्देश गारंटी नहीं देता है कि 0.1 + 0.2 === 0.3 सच है। एक पूर्णांक के रूप में मुद्रा का भंडारण निश्चितता देता है कि आपके आवेदन में उस तरह की त्रुटि नहीं होगी। हालांकि यह सबसे अच्छा समाधान नहीं हो सकता है। मैं समाधानों पर शोध करते हुए इस पृष्ठ पर पहुँचा और अभी तक नहीं किया गया।
गैरी ओट

27

यह आपकी जरूरत पर निर्भर करता है।

DECIMAL(10,2)आमतौर पर उपयोग करना पर्याप्त है लेकिन यदि आपको थोड़ा और सटीक मूल्यों की आवश्यकता है तो आप इसे सेट कर सकते हैं DECIMAL(10,4)

आप काम के साथ बड़ी मूल्यों की जगह तो 10साथ 19


मैं अपने पैसे के मूल्य के लिए दशमलव (10,2) का उपयोग कर रहा हूं, हालांकि जब मैं 867,000.00 की तरह कुछ डालता हूं तो यह 867 के रूप में बच जाता है। मैं क्या गलत कर रहा हूं?
कोडिनप्रोग्रेस

2
@codeinprogress गलत लोकेल / दशमलव विभाजक का उपयोग कर रहा है?
डेविड बालैसिक

15

यदि आपके एप्लिकेशन को ट्रिलियन तक के मनी वैल्यू को संभालने की आवश्यकता है, तो यह काम करना चाहिए: 13,2 यदि आपको GAAP (आमतौर पर स्वीकृत लेखा सिद्धांतों) का अनुपालन करने की आवश्यकता है तो उपयोग करें: 13,4

आमतौर पर आपको आउटपुट के राउंडिंग से पहले 13,4 पर अपने पैसे के मूल्यों को 13,2 पर समिट करना चाहिए।


5
यदि आप बिटकॉइन लेने जा रहे हैं, तो आपको 8 दशमलव स्थानों की आवश्यकता है, हालांकि अधिकांश वॉलेट mBTC पर जाते हैं जो 3 en.wikipedia.org/wiki/Bitcoin
ईसाई

मत सोचो कि यह उत्तर सत्य है। opendata.stackexchange.com/a/10348/13983 @ david.ee कि के लिए एक स्रोत मिल गया?
इवान कैरोल

@EvanCarroll मुझे david.ee के लिए जवाब देने दें। मुझे लगता है कि यह लेख स्रोत rietta.com/blog/2012/03/03/03/best-data-types-for-currencymoney-in
naXa

@naXa लिंक किसी भी स्रोत से कुछ भी उद्धृत नहीं करता है जो GAAP के लिए 13,4 का उपयोग करने के दावे का समर्थन करता है। आपने जो भी किया था, वह एक ऐसे लेख से जुड़ा था, जो एक ही तरह का निराधार दावा करता है।
इहानीय

6

वास्तव में यह प्रोग्रामर की प्राथमिकताओं पर निर्भर करता है। मैं व्यक्तिगत रूप से उपयोग करता हूं: आम तौर पर स्वीकृत लेखा सिद्धांत ( जीएएपी ) केnumeric(15,4) अनुरूप ।


5
इसका "प्रोग्रामर की प्राथमिकताओं" या जो आप 'व्यक्तिगत रूप से उपयोग' करते हैं, के लिए कुछ भी नहीं है। यह समस्या डोमेन द्वारा तय की जाती है, जिसके लिए एक दशमलव मूलांक की आवश्यकता होती है। यह एक ऐसा मामला नहीं है जिसमें प्रोग्रामर को अपनी निजी पसंद के मुताबिक व्यायाम करना पड़ता है।
लोर्ने

3

प्रयोग करके देखें

Decimal(19,4)

यह आमतौर पर हर दूसरे DB के साथ भी काम करता है


3

हम उपयोग करते हैं double

* हांफी *

क्यों?

क्योंकि यह किसी भी 15 अंकों की संख्या का प्रतिनिधित्व कर सकता है, जहां दशमलव बिंदु नहीं है । सभी एक 8 बाइट्स के लिए!

तो यह प्रतिनिधित्व कर सकता है:

  • 0.123456789012345
  • 123456789012345.0

... और बीच में कुछ भी।

यह उपयोगी है क्योंकि हम वैश्विक मुद्राओं के साथ काम कर रहे हैं , औरdouble विभिन्न स्थानों की दशमलव संख्या को स्टोर कर सकते हैं जिनकी हम संभावित रूप से मुठभेड़ करेंगे।

एक एकल doubleक्षेत्र जापानी येन में 999,999,999,999,999 का प्रतिनिधित्व कर सकता है, अमेरिकी डॉलर में 9,999,999,999,999.99 और यहां तक ​​कि बिटकॉइन में 9,999,999.99999999s

यदि आप ऐसा ही करने की कोशिश करते हैं decimal, तो आपको decimal(30, 15)14 बाइट्स की आवश्यकता होती है।

चेतावनियां

बेशक, का उपयोग doubleकिए बिना caveats नहीं है।

हालाँकि, यह सटीकता की हानि नहीं है क्योंकि कुछ इंगित करते हैं। भले ही doubleस्वयं आंतरिक रूप से आधार 10 प्रणाली के लिए सटीक नहीं हो सकता है , हम डेटाबेस से इसके महत्वपूर्ण दशमलव स्थानों तक खींचते हुए मूल्य को गोल करके सटीक बना सकते हैं। जरूरत है तो वह है (उदाहरण यदि यह आउटपुट होने वाला है, और बेस 10 का प्रतिनिधित्व आवश्यक है।)

कैवियट हैं, किसी भी समय हम इसके साथ अंकगणित करते हैं, हमें पहले परिणाम को सामान्य करने की आवश्यकता है (इसे अपने महत्वपूर्ण दशमलव स्थानों पर गोल करके):

  1. उस पर तुलना करना।
  2. इसे डेटाबेस में वापस लिखना।

एक अन्य प्रकार का चेतावनी है, इसके विपरीत, decimal(m, d)जहां डेटाबेस प्रोग्रामों को mअंकों से अधिक संख्या के साथ डालने से रोकेगा , ऐसी कोई मान्यता मौजूद नहीं है double। एक प्रोग्राम 20 अंकों का एक उपयोगकर्ता इनपुट मूल्य सम्मिलित कर सकता है और यह अंत में एक गलत राशि के रूप में दर्ज किया जाएगा।


पहली बार मैंने इस तरह से एक जवाब देखा है, दिलचस्प है। प्रश्न: अगर मैं डेटाबेस के लिए १.४१ की तरह एक फ्लोट लिखता हूं और किसी कारण से मुझे १.००० / ०००.००० की तरह mysql में कुछ बड़ी संख्या से गुणा करना पड़ता है। क्या गोल परिणाम बिल्कुल होगा: 1.410.000.000.000?
1925 को 12:25 बजे रोस्टर

@roelleor परिणाम 1,410,000,000,000 (हजारों विभाजक के रूप में अल्पविराम) होने के लिए इनपुट माना जाता है 1.410000000000(बारह महत्वपूर्ण दशमलव स्थान), लेकिन गुणा करके 1,000,000,000,000 (जो दशमलव बिंदु से बचे 13 महत्वपूर्ण अंक हैं) का अर्थ है कि हम साथ काम कर रहे हैं कम से कम 25 अंकों का संयुक्त महत्व। यह अब तक एक डबल के लिए उपलब्ध 15 से आगे निकल गया है, इसलिए डिजाइन-वार मुझे लगता है कि यह बहुत टूट जाएगा।
एंटैक

2

उस समय यह सवाल पूछा गया था कि बिटकॉइन की कीमत के बारे में किसी ने नहीं सोचा था। बीटीसी के मामले में, यह संभवतः उपयोग करने के लिए अपर्याप्त है DECIMAL(15,2)। यदि बिटकॉइन $ 100,000 या उससे अधिक हो जाएगा, तो हमें DECIMAL(18,9)अपने ऐप्स में क्रिप्टोकरेंसी का समर्थन करने के लिए कम से कम की आवश्यकता होगी ।

DECIMAL(18,9)MySQL में 12 बाइट्स लेता है ( 4 बाइट्स प्रति 9 अंक )।


> एक बिटकॉइन को 8 दशमलव स्थानों पर विभाजित किया जा सकता है। इसलिए, 0.00000001 बीटीसी सबसे छोटी राशि है जिसे लेनदेन में संभाला जा सकता है। मुझे लगता है कि आप 9 के बजाय 8 मतलब है?
खतरे '

1
मुझे पता है, लेकिन 9 के रूप में एक ही डिस्क स्थान लेता है 8. MySQL डॉक्स से: "DECIMAL कॉलम के लिए मान एक बाइनरी प्रारूप का उपयोग करके संग्रहीत किए जाते हैं जो 9 दशमलव अंकों को 4 बाइट्स में पैक करता है"
bizwiz

ओ सॉरी, अब मैं तुम्हें ले आता हूं। धन्यवाद।
खतरे '

2

BIGINTकम भंडारण स्थान का उपयोग करने के कारण 100 या उससे अधिक के रूप में पैसे का भंडारण करना सभी "सामान्य" स्थितियों में कोई मतलब नहीं है।

  • जीएएपी के साथ गठबंधन करने के लिए मुद्राओं को अंदर रखना पर्याप्त है DECIMAL(13,4)
  • MySQL मैनुअल पढ़ता है कि इसे स्टोर करने के लिए 9 अंकों के प्रति 4 बाइट्स की आवश्यकता है DECIMAL
  • DECIMAL(13,4) 9 अंकों + 4 अंश अंकों (दशमलव स्थानों) => 4 + 2 बाइट्स = 6 बाइट्स का प्रतिनिधित्व करता है
  • स्टोर करने के लिए आवश्यक 8 बाइट्स की तुलना करें BIGINT

1

यदि GAAP अनुपालन आवश्यक है या आपको 4 दशमलव स्थानों की आवश्यकता है:

DECIMAL (13, 4) जो अधिकतम मूल्य का समर्थन करता है:

$ 999,999,999.9999

अन्यथा, यदि 2 दशमलव स्थान पर्याप्त हैं: DECIMAL (13,2)

src: https://rietta.com/blog/best-data-types-for-currencymoney-in/


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.