[sql] PostgreSQL : 통화에 어떤 데이터 유형을 사용해야합니까?

여기에Money 설명 된대로 유형이 권장되지 않는 것 같습니다.

내 애플리케이션은 통화를 저장해야합니다. 어떤 데이터 유형을 사용해야합니까? 숫자, 돈 또는 FLOAT?



답변

강제 2 단위 정밀도의 숫자 입니다. 통화를 나타 내기 위해 float 또는 float와 같은 데이터 유형을 사용하지 마십시오. 그렇게한다면 재무 보고서의 수익 수치가 + 또는-몇 달러에 의해 부정확 할 때 사람들이 불만을 갖게 될 것입니다.

화폐 유형은 내가 말할 수있는 한 역사적인 이유로 남아 있습니다.


답변

귀하의 출처는 공식적인 것이 아닙니다. 그것은 2011 년으로 거슬러 올라갑니다. 그리고 저는 저자도 알아볼 수 없습니다. 돈 유형이 공식적으로 “실망”경우 PostgreSQL은 매뉴얼에 그렇게 말 것 – 그것이하지 않는 .

들어 더 공식 소스 읽기 (그냥이 주에서!)를 pgsql-일반적으로이 스레드를 , 다르시 JM 가인 (돈 유형의 원래 저자)와 톰 레인을 포함한 핵심 개발자 진술과 :

최근 릴리스의 개선 사항에 대한 관련 답변 (및 의견!) :

기본적으로 money(매우 제한적인) 용도가 있습니다. 포스트 그레스 위키는 크게, 그것을 피할 그 좁게 정의 된 경우를 제외하기 위해 제안합니다. 장점 numeric성능 입니다.

decimalnumericPostgres 의 별칭이며 화폐 데이터에 널리 사용되며 “임의의 정밀도”유형입니다. 설명서 :

이 유형 numeric은 매우 많은 자릿수의 숫자를 저장할 수 있습니다. 특히 정확성이 필요한 금액 및 기타 수량을 저장하는 데 권장됩니다.

개인적으로 integer분수 센트가 발생하지 않는 경우 (기본적으로 돈이 합리적 일 경우) 센트 를 나타내는 통화로 저장하는 것을 좋아합니다 . 언급 된 다른 옵션보다 더 효율적입니다.


답변

선택 사항은 다음과 같습니다.

  1. bigint: 금액을 센트로 저장합니다. 이것이 EFTPOS 트랜잭션이 사용하는 것입니다.
  2. decimal(12,2): 소수점 이하 두 자리로 금액을 저장합니다. 이것은 대부분의 일반 원장 소프트웨어가 사용하는 것입니다.
  3. float: 끔찍한 아이디어-부적절한 정확성. 이것은 순진한 개발자가 사용하는 것입니다.

옵션 2는 가장 일반적이며 작업하기 가장 쉽습니다. 정밀도 (내 예에서는 12, 모두 12 자리 숫자)를 사용자에게 가장 적합한만큼 크거나 작게 만드십시오.

계산 (예 : 환율 포함)의 결과 인 여러 트랜잭션을 비즈니스 의미가있는 단일 값으로 집계하는 경우 정확한 매크로 값을 제공하려면 정밀도가 더 높아야합니다. decimal(18, 8)합계가 정확하고 표시를 위해 개별 값을 센트 정밀도로 반올림 할 수 있도록 다음과 같은 것을 사용하는 것이 좋습니다.


답변

모든 통화 필드를 다음과 같이 유지합니다.

numeric(15,6)

소수 자리를 많이 사용하는 것은 과도 해 보이지만 여러 통화를 처리해야 할 가능성이 아주 적다면 변환을 위해 그 정도의 정밀도가 필요합니다. 사용자에게 무엇을 제시하든 항상 미국 달러로 저장합니다. 그런 식으로 나는 관련된 날의 환율을 고려할 때 다른 통화로 쉽게 변환 할 수 있습니다.

하나의 통화 외에는 아무것도하지 않는다면, 여기서 최악의 것은 0을 저장하기 위해 약간의 공간을 낭비한 것입니다.


답변

다음으로 저장된 64 비트 정수 사용 bigint

마이크로 달러 (또는 유사한 주요 통화)를 사용하는 것이 좋습니다. 마이크로는 백만 분의 1을 의미하므로 1 마이크로 달러 = $ 0.000001입니다.

  • 사용하기 쉽고 모든 언어와 호환됩니다.
  • 센트의 일부를 처리하기에 충분한 정밀도.
  • 매우 작은 단위당 가격 책정 (예 : 광고 노출 또는 API 요금)에 적용됩니다.
  • 저장을위한 데이터 크기가 문자열 또는 숫자보다 작습니다.
  • 계산을 통해 정확도를 유지하고 최종 출력에 반올림을 적용하기 쉽습니다.

답변

BigInt통화를 가장 작은 통화 단위로 화폐 가치를 나타내는 양의 정수로 저장하는 데 사용 합니다 (예 : $ 1.00를 저장하려면 100 센트, ​​100 엔을 저장하려면 100 (일본 엔, 0 진수 통화)) 이것은 Stripe가하는 일입니다. 글로벌 전자 상거래를위한 가장 중요한 금융 서비스 회사입니다.


답변