여기에Money
설명 된대로 유형이 권장되지 않는 것 같습니다.
내 애플리케이션은 통화를 저장해야합니다. 어떤 데이터 유형을 사용해야합니까? 숫자, 돈 또는 FLOAT?
여기에Money
설명 된대로 유형이 권장되지 않는 것 같습니다.
내 애플리케이션은 통화를 저장해야합니다. 어떤 데이터 유형을 사용해야합니까? 숫자, 돈 또는 FLOAT?
답변:
강제 2 단위 정밀도의 숫자 입니다. 통화를 나타 내기 위해 float 또는 float와 같은 데이터 유형을 사용하지 마십시오. 그렇게한다면 재무 보고서의 수익 수치가 + 또는-몇 달러에 의해 부정확 할 때 사람들이 불만을 갖게 될 것입니다.
화폐 유형은 내가 말할 수있는 한 역사적인 이유로 남아 있습니다.
scale - precision
numeric(3,2)
최대 저장할 수있을 것입니다9.99
3-2 = 1
귀하의 출처는 공식적인 것이 아닙니다. 그것은 2011 년으로 거슬러 올라갑니다. 그리고 저는 저자도 알아볼 수 없습니다. 돈 유형이 공식적으로 "실망"경우 PostgreSQL은 매뉴얼에 그렇게 말 것 - 그것이하지 않는 .
들어 더 공식 소스 읽기 (그냥이 주에서!)를 pgsql-일반적으로이 스레드를 , 다르시 JM 가인 (돈 유형의 원래 저자)와 톰 레인을 포함한 핵심 개발자 진술과 :
최근 릴리스의 개선 사항에 대한 관련 답변 (및 의견!) :
기본적으로 money
(매우 제한적인) 용도가 있습니다. 포스트 그레스 위키는 크게, 그것을 피할 그 좁게 정의 된 경우를 제외하기 위해 제안합니다. 장점 numeric
은 성능 입니다.
decimal
numeric
Postgres 의 별칭이며 화폐 데이터에 널리 사용되며 "임의의 정밀도"유형입니다. 설명서 :
이 유형
numeric
은 매우 많은 자릿수의 숫자를 저장할 수 있습니다. 특히 정확성이 필요한 금액 및 기타 수량을 저장하는 데 권장됩니다.
개인적으로 integer
분수 센트가 발생하지 않는 경우 (기본적으로 돈이 합리적 일 경우) 센트 를 나타내는 통화로 저장하는 것을 좋아합니다 . 언급 된 다른 옵션보다 더 효율적입니다.
money
실제로 유형이 더 이상 사용되지 않는 시기이기도 합니다. 문제가 수정되었으며 유형이 이후 버전에서 다시 추가되었습니다. 개인적으로 저는 integer
센트 를 나타내는 통화를 저장하는 것을 좋아합니다 .
선택 사항은 다음과 같습니다.
bigint
: 금액을 센트로 저장합니다. 이것이 EFTPOS 트랜잭션이 사용하는 것입니다.decimal(12,2)
: 소수점 이하 두 자리로 금액을 저장합니다. 이것은 대부분의 일반 원장 소프트웨어가 사용하는 것입니다.float
: 끔찍한 아이디어-부적절한 정확성. 이것은 순진한 개발자가 사용하는 것입니다.옵션 2는 가장 일반적이며 작업하기 가장 쉽습니다. 정밀도 (내 예에서는 12, 모두 12 자리 숫자)를 사용자에게 가장 적합한만큼 크거나 작게 만드십시오.
계산 (예 : 환율 포함)의 결과 인 여러 트랜잭션을 비즈니스 의미가있는 단일 값으로 집계하는 경우 정확한 매크로 값을 제공하려면 정밀도가 더 높아야합니다. decimal(18, 8)
합계가 정확하고 표시를 위해 개별 값을 센트 정밀도로 반올림 할 수 있도록 다음과 같은 것을 사용하는 것이 좋습니다.
numeric(15,4)
또는 numeric(15,6)
좋은 생각입니다.
모든 통화 필드를 다음과 같이 유지합니다.
numeric(15,6)
소수 자리를 많이 사용하는 것은 과도 해 보이지만 여러 통화를 처리해야 할 가능성이 아주 적다면 변환을 위해 그 정도의 정밀도가 필요합니다. 사용자에게 무엇을 제시하든 항상 미국 달러로 저장합니다. 그런 식으로 나는 관련된 날의 환율을 고려할 때 다른 통화로 쉽게 변환 할 수 있습니다.
하나의 통화 외에는 아무것도하지 않는다면, 여기서 최악의 것은 0을 저장하기 위해 약간의 공간을 낭비한 것입니다.
bigint
마이크로 달러 (또는 유사한 주요 통화)를 사용하는 것이 좋습니다. 마이크로는 백만 분의 1을 의미하므로 1 마이크로 달러 = $ 0.000001입니다.
numeric(15,6)
다른 대답에서 제안 되었습니까?
bigint
. 이 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... 하지만 (예를 들어, 당신이 곱 그것을 플로트로 쉽게 통화 변환을 수행 할 수 없을 때) (지금은) 제한된 지원이 제공 및주의 사항 . 마이크로 달러를 사용하여 JS 정수에 저장할 수있는 최대 값이 90 억 달러라는 점을 감안할 때 대부분의 경우 여전히 좋습니다.
BigInt
통화를 가장 작은 통화 단위로 화폐 가치를 나타내는 양의 정수로 저장하는 데 사용 합니다 (예 : $ 1.00를 저장하려면 100 센트, 100 엔을 저장하려면 100 (일본 엔, 0 진수 통화)) 이것은 Stripe가하는 일입니다. 글로벌 전자 상거래를위한 가장 중요한 금융 서비스 회사입니다.