PostgreSQL: মুদ্রার জন্য কোন ডেটাটাইপ ব্যবহার করা উচিত?


128

Moneyপ্রকারের মতো মনে হচ্ছে এখানে বর্ণিত হিসাবে নিরুৎসাহিত করা হচ্ছে

আমার অ্যাপ্লিকেশনটির মুদ্রা সংরক্ষণ করা দরকার, আমি কোন ডেটাটাইপ ব্যবহার করব? সংখ্যার, অর্থ বা ফ্লোট?


7
আপনি যদি পুরো থ্রেডটি পড়ে থাকেন তবে সংখ্যাটি হ'ল উপায়।
রাজেপিটিয়া

একাধিক মুদ্রার সাথে কাজ করা এবং পরিমাণের পাশাপাশি কারেন্সি কোডগুলি সংরক্ষণের বিষয়ে যত্নশীল যে কেউ, আপনি ডাটাবেস (এসও) এবং আইএসও 4217 (উইকিপিডিয়া) এ কারেন্সি মডেলিংটি দেখতে চাইতে পারেন । সংক্ষিপ্ত উত্তরটি হ'ল আপনার দুটি কলাম দরকার।
ফ্যাবিয়েন স্নাউয়ার্ট

উত্তর:


90

জোরপূর্বক 2 ইউনিট সংক্ষিপ্ততা সহ সংখ্যাযুক্ত । মুদ্রা উপস্থাপন করতে কখনই ডেটাটাইপের মতো ফ্লোট বা ফ্লোট ব্যবহার করবেন না কারণ যদি আপনি করেন, আর্থিক প্রতিবেদনের নীচের লাইনের চিত্রটি + বা - কয়েক ডলার দ্বারা ভুল হয়ে থাকে তখন লোকেরা অসন্তুষ্ট হতে চলেছে।

যতদূর আমি বলতে পারি অর্থের ধরনটি historicalতিহাসিক কারণে সবেমাত্র ফেলে রাখা হয়েছে।


9
আপনি ভাসমান পয়েন্ট এড়াতে হবে না কেন। এমনকি আপনি যদি কোন নির্ভুলতা ব্যবহার না করেন তবে দশটির শক্তিতে বিভক্ত না হয়ে এমন কোনও কিছু দিয়ে ভাগ করলেও সংখ্যাসূচকের গোলাকৃতি ত্রুটি থাকবে। (2 এর যথার্থতা যাইহোক খারাপ ধারণা ... দস্তাবেজগুলি পরীক্ষা করুন
ডোরাদাস

6
আপনি যদি স্বেচ্ছাচারী মুদ্রাগুলিকে সমর্থন করতে চান তবে কখনই 2 এর সমান স্কেল তৈরি করবেন না (পোস্টগ্রিস্কল ভাষায়, নির্ভুলতা সমস্ত অঙ্কের একটি সংখ্যা, যেমন 121.121 এ এটি 6 এর সমান)। বাহরাইন দিনারের মতো মুদ্রা রয়েছে, যেখানে 1000 টি উপ-ইউনিট এক ইউনিটের সমান এবং এমন মুদ্রাগুলি রয়েছে যেখানে উপ-ইউনিট একেবারেই নেই।
নিকোলা আরিপভ

@ নিকোলাআরিপভ ভাল বিষয়, সুতরাং সর্বোচ্চটি আসলেscale - precision
কনরাড

1
numeric(3,2)সর্বাধিক সঞ্চয় করতে সক্ষম হবে9.99 3-2 = 1
Konrad

5
এটা করো না! অন্য ভাষাগুলিতে কোনও মান লোড করার আগে এবং পরে পূর্ণসংখ্যার সাথে গণিত করার আগে আপনি 100 দ্বারা গুণ করার পরিকল্পনা না করেন - আপনি ভুল ফলাফল দিয়ে শেষ করবেন। সেন্টগুলিতে জিনিসগুলি সঞ্চয় করুন (আপনি যে ক্ষুদ্রতম মুদ্রা ইউনিটটি ব্যবহার করছেন) এবং নিজেকে কিছু ঝামেলা বাঁচান। অনেক ক্ষেত্রে খুব খারাপ উত্তর।
আভামান্ডার

111

আপনার উত্স কোনওভাবেই সরকারী নয়। এটি ২০১১-এর তারিখ এবং আমি লেখককেও চিনতে পারি না। টাকার প্রকারটি যদি অফিসিয়ালি "নিরুৎসাহিত" হয়ে থাকে তবে পোস্টগ্র্যাস এসকিউএল ম্যানুয়ালটিতে এমনটি বলত - যা তা নয়

জন্য আরো একটি সরকারী উৎস পড়তে (ঠিক এই সপ্তাহ থেকে!) Pgsql-সাধারণভাবে এই থ্রেড D'Arcy জে এম কেইন (অর্থ টাইপের মূল লেখক) এবং টম লেন সহ কোর ডেভেলপারদের থেকে বিবৃতি দিয়ে:

সাম্প্রতিক প্রকাশে উন্নতি সম্পর্কে সম্পর্কিত উত্তর (এবং মন্তব্যসমূহ!):

মূলত, moneyএর (খুব সীমাবদ্ধ) ব্যবহার রয়েছে। Postgres উইকি মূলত এটা এড়ানোর জন্য, যারা একটুর জন্য সংজ্ঞায়িত ক্ষেত্রে করা ছাড়া তাদের প্রস্তাব দেওয়া হয়। সুবিধা বেশি numericহয় কর্মক্ষমতা

decimalnumericপোস্টগ্র্রেসের জন্য কেবলমাত্র একটি উপনাম , এবং আর্থিক তথ্যগুলির জন্য ব্যাপকভাবে ব্যবহৃত হয়, এটি একটি "স্বেচ্ছাসেবক নির্ভুলতা" প্রকার। ম্যানুয়াল :

প্রকারটি numericখুব বড় সংখ্যার সংখ্যার সাথে সংখ্যা সংরক্ষণ করতে পারে। এটি বিশেষত আর্থিক পরিমাণ এবং অন্যান্য পরিমাণে যেখানে নির্ভুলতার প্রয়োজন সেখানে সংরক্ষণ করার জন্য সুপারিশ করা হয়।

ব্যক্তিগতভাবে, আমি integerভগ্নাংশের সেন্টগুলি কখনই না ঘটে (মূলত যেখানে অর্থ অর্থবোধ করে) যদি আমি মুদ্রাটিকে সেন্টের প্রতিনিধিত্ব করে সংরক্ষণ করতে চাই । উল্লিখিত বিকল্পগুলির তুলনায় এটি আরও দক্ষ।


4
মেলিং তালিকাগুলিতে বেশ কয়েকটি আলোচনা রয়েছে যা এই ধারণাটি দেয় যে অর্থের প্রকারটি কমপক্ষে প্রস্তাবিত নয়, যেমন: এখানে: postgresql.nabble.com/Money-type-todos-td1964190.html#a1964192 আরও ভাল হতে: সংস্করণ 8.2 জন্য ম্যানুয়াল হয়নি সেটিতে কল থামানো হয়েছে: postgresql.org/docs/8.2/static/datatype-money.html
a_horse_with_no_name

11
@ এ_হর্স_বিহীন_নাম_নাম: আপনার লিঙ্কটি ২০০ from সালের থ্রেডের সাথে সম্পর্কিত, এটি তখনও ছিল যখন ৮.২ বর্তমান সংস্করণ ছিল এবং moneyপ্রকারটি আসলে প্রত্যাখ্যানিত হয়েছিল। সমস্যাগুলি স্থির করা হয়েছে এবং পরবর্তী সংস্করণগুলিতে টাইপটি আবার যুক্ত করা হয়েছে। ব্যক্তিগতভাবে আমি integerসেন্টের প্রতিনিধিত্বকারী হিসাবে মুদ্রা সঞ্চয় করতে চাই ।
এরউইন ব্র্যান্ডস্টেটার

1
এরউইন, আপনি একাই ডাটাবেস দৃষ্টিকোণ থেকে সঠিক চিন্তাভাবনা হতে পারে। তবে আপনি যদি পোস্টগ্র্যাস্কেল + জাভা একত্রিত করেন তবে এটি মোটেই ভাল নয় (আমার অভিজ্ঞতা থেকে)। আপনার মন্তব্য পড়ে, আমি আমার বেশিরভাগ মুদ্রা ক্ষেত্রের জন্য অর্থ ব্যবহার করেছি এবং এখন আমি এই জাভা ব্যতিক্রমটি পেয়েছি : " এসকিউএলএক্সসেপশন হয়েছে: org.postgresql.util.PSQLException: ডাবল টাইপের জন্য খারাপ মান: 2,500.00 "। আমি গুগল করেছি এবং কোনও ভাল সমাধান খুঁজে পাইনি, সুতরাং আমি এখন তাদের সবাইকে NUMERIC বা DECIMAL এ পরিবর্তনের বিরক্তিকর কাজে আছি !!!
এমডি

1
@ এমডি: শুনে শুনে দুঃখিত, তবে আমি স্পষ্টত জাভার পক্ষে কথা বলিনি (যা আমি পারছি না)। ত্রুটির বার্তাটি বিজোড়। "দ্বৈত"? এবং হাজার-বিভাজক একটি সমস্যাও হতে পারে। আপনি এটি সম্পর্কে একটি নতুন প্রশ্ন শুরু করতে চাইতে পারেন।
এরউইন ব্র্যান্ডস্টেটার

2
@ পাইরেট অ্যাপ: হ্যাঁ, আমার ব্যক্তিগত প্রিয়। আপনি আমার উত্তরটির শেষ বাক্যটি মিস করেছেন, কেবল এটিই বলেছিলেন।
এরউইন ব্র্যান্ডসেটেটার 21

68

আপনার পছন্দগুলি হ'ল:

  1. bigint: সেন্ট মধ্যে পরিমাণ সঞ্চয়। EFTPOS লেনদেন এটি ব্যবহার করে।
  2. decimal(12,2): ঠিক দুটি দশমিক স্থানের সাথে পরিমাণ সঞ্চয় করুন। এটি সর্বাধিক সাধারণ খাত্তয় সফ্টওয়্যার ব্যবহার করে।
  3. float: ভয়ানক ধারণা - অপর্যাপ্ত নির্ভুলতা। নিষ্পাপ বিকাশকারীরা এটি ব্যবহার করেন।

বিকল্প 2 কাজ করা সবচেয়ে সাধারণ এবং সবচেয়ে সহজ। যথার্থতাটি তৈরি করুন (আমার উদাহরণে 12 টি, অর্থাত্ 12 টি সংখ্যার অর্থ) আপনার পক্ষে সবচেয়ে বেশি কার্যকর বা বৃহত আকারে করুন।

মনে রাখবেন যে আপনি যদি একাধিক লেনদেনকে একত্রিত করছেন যা কোনও গণনার (যেমন একটি বিনিময় হারের সাথে জড়িত) ব্যবসায়ের অর্থ সহ একক মানের হয়ে থাকে তবে সঠিক ম্যাক্রো মান সরবরাহ করার জন্য যথাযথতা আরও বেশি হওয়া উচিত; এরকম কিছু ব্যবহার করার কথা বিবেচনা করুন decimal(18, 8)যাতে যোগফলটি নির্ভুল হয় এবং স্বতন্ত্র মানগুলি প্রদর্শনের জন্য শতকরা নির্ভূলতায় গোল করা যায়।


10
আপনি যদি কোনও ধরণের বিপরীত ট্যাক্স গণনা বা বৈদেশিক মুদ্রার সাথে কাজ করে থাকেন তবে আপনার কমপক্ষে 4 দশমিক স্থানের প্রয়োজন, বা আপনি ডেটা হারাবেন। সুতরাং numeric(15,4)বা numeric(15,6)একটি ভাল ধারণা।
পেট্রুস থেরন

3
একটি চতুর্থ বিকল্প রয়েছে - সেটি হল স্ট্রিং ব্যবহার করা এবং হোস্ট ভাষায় সমতুল্য নন-ক্ষতির দশমিক প্রকার ব্যবহার করা।
ioquatix

2
একটি ছোট আকারের পূর্ণসংখ্যা সম্পর্কে কী বলা যায়, এটি যদি 100x স্কেলিং ফ্যাক্টর সহ 10000045 হিসাবে সংরক্ষণ করা থাকে তবে 10000.045 টি স্টোর করলে ক্ষতি হবে না?
পাইরেটএপ

26

আমি আমার সমস্ত আর্থিক ক্ষেত্রকে এইভাবে রাখি:

numeric(15,6)

এটি অনেকগুলি দশমিক জায়গাগুলি পাওয়া অত্যধিক বলে মনে হয়, তবে যদি একাধিক সামান্যতম সুযোগও থাকে তবে আপনাকে একাধিক মুদ্রার সাথে ডিল করতে হবে আপনার রূপান্তর করার জন্য সেই পরিমাণ নির্ভুলতা দরকার। আমি কোনও ব্যবহারকারীকে কী উপস্থাপন করছি তা বিবেচনা না করে আমি সবসময় মার্কিন ডলারের কাছে সঞ্চয় করি। এইভাবে জড়িত দিনের জন্য রূপান্তর হারকে আমি সহজেই অন্য যে কোনও মুদ্রায় রূপান্তর করতে পারি।

আপনি যদি কখনও এক মুদ্রা ব্যতীত অন্য কিছু না করেন তবে এখানে সবচেয়ে খারাপ জিনিসটি হ'ল কিছু শূন্য সংরক্ষণ করার জন্য আপনি কিছুটা জায়গা নষ্ট করেছিলেন।


6
কাটা কাটা না থাকার কারণে এটিতে ভুল ফলাফলের ঝুঁকি রয়েছে। যদি ননজারো মানহীনভাবে বাকী দশমিক স্থানে ফাঁস করে দেয়, উদাহরণস্বরূপ, একটি মূল্যের ক্ষেত্র যেখানে 0.333333 ডলার রয়েছে, তবে আপনার এমন পরিস্থিতি দেখা দিতে পারে যেখানে সিস্টেমটি প্রত্যেকে $ 0.33 প্রতি 3 আইটেম কেনার ফলাফল দেখায়, $ 0.99 এর পরিবর্তে মোট ১.০০ ডলার পর্যন্ত।
পিটারিস

1
পেরেরিস, সুতরাং আপনি পরিবর্তে কি পরামর্শ? আপনি এই রাউন্ডে যত স্পষ্টতা ফেলেছেন তা কোনও সমস্যা হতে পারে। আমি কেবল এর চেয়ে ভাল উপায় খুঁজে পাইনি, এমনকি যদি এটি আদর্শ নাও হয়।
মাইকেল কোলেট 13

3
স্থির পয়েন্ট এবং যেখানে উপযুক্ত উপযুক্ত কাটা। আপনি যখন "স্ট্যাটিভ" অর্থের মূল্য পৌঁছে যাবেন যেমন কোনও গ্রাহকের কাছে দেওয়া দাম, এটি যথাযথ মেট্রিকের মধ্যে হওয়া উচিত, যা বেশিরভাগ ক্ষেত্রে স্ট্যান্ডার্ড খুচরা পরিবেশে পুরো সেন্টে থাকবে। আপনার যদি ব্যবসায়ের বিভিন্ন চাহিদা থাকে (যেমন প্রতি ইউনিট উচ্চ-ভলিউম সামগ্রীর দাম) সঠিকতার আলাদা আলাদা সেটিং হতে পারে তবে আপনাকে অবশ্যই উপস্থাপনাটি স্টোরেজ সহ একসাথে করতে হবে - আপনি যদি এক্স ডেসিমাল সহ অর্থের নম্বরটি প্রদর্শন করেন (বা বিপরীতে, পুরো হাজার যেমন) তারপর আপনি এটি মাধ্যমে সঞ্চয় করা উচিত নয় যে সঠিকতা, কম কিন্তু আর।
পিটারিস

অনেক খুচরা সম্পর্কিত সাইটগুলির জন্য যা কাজ করতে পারে। আমি যে মূল প্রকল্পটির সাথে কাজ করি তার মধ্যে একটি পক্ষের কাছে একই মুদ্রায় একই মূল্য, অন্য মুদ্রার ক্লায়েন্টের সাথে, 3 য় মধ্যে সরবরাহকারীর জন্য প্রয়োজন হতে পারে see
মাইকেল কললেট

19

হিসাবে সঞ্চিত একটি 64-বিট পূর্ণসংখ্যা ব্যবহার করুন bigint

আমি মাইক্রো-ডলার (বা অনুরূপ প্রধান মুদ্রা) ব্যবহার করার পরামর্শ দিচ্ছি। মাইক্রো মানে 1 মিলিয়ন তম 1 মাইক্রো-ডলার = $ 0.000001।

  • ব্যবহার সহজ এবং প্রতিটি ভাষার সাথে সামঞ্জস্যপূর্ণ।
  • শতকের ভগ্নাংশটি হ্যান্ডেল করার জন্য যথেষ্ট যথার্থতা।
  • খুব সামান্য প্রতি ইউনিট দামের জন্য কাজ করে (যেমন বিজ্ঞাপনের ছাপ বা এপিআই চার্জ)।
  • স্ট্রিং বা সংখ্যার চেয়ে স্টোরেজের জন্য ছোট ডেটা আকার।
  • চূড়ান্ত গণনার মাধ্যমে নির্ভুলতা বজায় রাখা এবং চূড়ান্ত আউটপুটে গোলটি প্রয়োগ করা সহজ।

1
এটি সবচেয়ে সঠিক উত্তর এবং যে কোনও যুক্তিসঙ্গত সফ্টওয়্যার হ'ল ক্ষুদ্রতম মুদ্রা ইউনিট নিয়ে কাজ করে with পূর্ণসংখ্যার উপর সমস্ত গণিত করার অর্থ আপনার কোনও ভাষা-নির্দিষ্ট ভাসা ম্যাংলিংয়ের সাথে ডিল করতে হবে না।
আভামান্ডার

1
এটিও ব্যবহার করা হবে। ধন্যবাদ

কেন এই ওভার numeric(15,6)অন্য জবাব প্রস্তাব?
জুলিয়াসজ গোনেরা

উত্তরটিতে তালিকাভুক্ত কারণে @ জুলিয়াসগোনেরা। পূর্ণসংখ্যাগুলি সর্বত্রই ছোট এবং সমর্থিত এবং গণিতের কাটাকাটি সমস্যাগুলি এড়িয়ে চলুন। এটি মূলত সংখ্যাসূচক ব্যবহার করছে তবে দশমিকগুলি স্থানান্তর করছে যাতে আপনার একটি সম্পূর্ণ সংখ্যা থাকে যা অনেক বেশি উপযুক্ত।
মণি গন্ধাম

1
আহ, ঠিক আছে, আমি স্টোরেজ সম্পর্কে অংশটি মিস করেছি। ধন্যবাদ! সংক্রান্ত "ব্যবহার করা সহজ এবং প্রতিটি ভাষায় সঙ্গে সামঞ্জস্যপূর্ণ" দুর্ভাগ্যবশত জাভাস্ক্রিপ্ট পূর্ণসংখ্যার আপ 9007199254740991 যার সর্বোচ্চ মানের চেয়ে 1000x উপর ছোট সমর্থন bigint। এখানে বিকাশকারী.মোজিলা.আর.ইন.ইউএস / ডকস / ওয়েবে / জাভাস্ক্রিপ্ট / রেফারেন্স / but তবে এটি সীমিত সহায়তায় (আপাতত) এবং সতর্কতা সহ আসে (যেমন আপনি মুদ্রা রূপান্তর করার সময় সহজেই এটি একটি ফ্লোটে গুণতে পারবেন না) । মাইক্রো-ডলার ব্যবহার করে আপনি জেএস পূর্ণসংখ্যায় সর্বাধিক সঞ্চয় করতে পারবেন তা 9 billion বিলিয়ন ডলার যা সম্ভবত এখনও বেশিরভাগ ক্ষেত্রেই ভাল।
জুলিয়াসজ গোনেরা

3

BigIntক্ষুদ্রতম মুদ্রা ইউনিটে আর্থিক মান উপস্থাপন করে এমন একটি ইতিবাচক পূর্ণসংখ্যা হিসাবে মুদ্রা সঞ্চয় করতে ব্যবহার করুন (উদাহরণস্বরূপ, c 1.00 বা 100 ডলার সংরক্ষণের জন্য 100 সেন্ট বা 100 ডলার (জাপানি ইয়েন, একটি শূন্য দশমিক মুদ্রা) সংরক্ষণ করা। স্ট্রিপ যা করে - এক গ্লোবাল ইকমার্সের জন্য সবচেয়ে গুরুত্বপূর্ণ আর্থিক পরিষেবা সংস্থাগুলি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.