MySQL에 돈 가치를 저장하는 최고의 데이터 유형


279

MySQL 데이터베이스에 많은 레코드를 저장하고 싶습니다. 그들 모두는 돈 가치를 포함합니다. 그러나 각 숫자에 몇 개의 숫자가 삽입되는지 모르겠습니다.
이 목적으로 어떤 데이터 유형을 사용해야합니까?
VARCHAR 또는 INT (또는 기타 숫자 데이터 유형)?


13
deimal(10,2)내가 사용하는 것입니다 ... 예상 크기에 따라 값을 조정할 수 있습니다
Manse

답변:


370

돈은 정확한 표현이 필요하기 때문에 대략적인 데이터 유형을 사용하지 마십시오 float. 이와 같은 고정 소수점 숫자 데이터 유형을 사용할 수 있습니다

decimal(15,2)
  • 15 정밀도 (소수 자릿수를 포함한 전체 값 길이)
  • 2 소수점 이하 자릿수입니다.

MySQL 숫자 유형을 참조하십시오 .

이러한 유형은 통화 데이터 와 같이 정확한 정밀도를 유지하는 것이 중요 할 때 사용됩니다 .


3
이 경우 십진수와 숫자 데이터 유형의 차이점은 무엇입니까?
Emilio Gort

60
MySQL의에서 decimalnumeric동일합니다.
juergen d

21
저는 개인적으로 numeric(19,4)새로운 요청을 쉽게하고 채택 할 수있는 더 나은 손길을주는 재무 기록을 위해 사용 합니다.
YahyaE

10
YahyaE에 동의합니다. 소수가 많을수록 좋습니다. 바레인, 요르단 또는 쿠웨이트 디나르와 같이 일반적으로 소수점 이하 3 자리를 사용하는 통화가 있으므로 3 이상이 필요합니다. 4 또는 5가 좋습니다.
Edwin Hoogerbeets

1
@EdwinHoogerbeets 회계사가 아닌 ... 영국에서 작은 비즈를 운영하고 있습니다 ... 오래 전에 어딘가에서 읽은 것을 기억합니다. 파운드 수치는 £, $ 등의 경우에도 소수점 이하 4 자리까지 저장해야 특정 계산이 가능합니다. 실제로 모호한 회계 상황에 대해서는 마지막 2 자리를 사용 합니다. Wd는 확인 / 반환 회계사가 필요합니다.
마이크 설치류

88

사용 DECIMAL하거나 NUMERIC둘 다 동일

DECIMAL 및 NUMERIC 유형은 정확한 숫자 데이터 값을 저장합니다. 이러한 유형은 통화 데이터와 같이 정확한 정밀도를 유지하는 것이 중요 할 때 사용됩니다. MySQL에서 NUMERIC은 DECIMAL로 구현되므로 DECIMAL에 대한 다음 설명은 NUMERIC에 동일하게 적용됩니다. : MySQL

DECIMAL(10,2)

설정 예

잘 읽음


3
혼란 스러울 수 있지만 스크린 샷이 답변 텍스트 (정밀도, 배율)와 일치하지 않습니다.
Patrick Hofman

내 돈 가치에 decimal (10,2)를 사용하고 있지만 867,000.00과 같은 것을 넣으면 867로 저장됩니다. 내가 뭘 잘못하고 있습니까?
codeinprogress

32

나는을 사용 하고 100BIGINT곱하여 값을 저장하여 정수가되도록 선호합니다 .

예를 들어, 통화 값을 나타내 93.49려면 값을로 저장 9349하고 값 을 100으로 나누고 표시 할 수 있습니다 . 이것은 적은 저장 공간을 차지할 것입니다.

주의 :
대부분 currency * currency곱셈을 수행하지 않습니다. 곱셈을 수행 하는 경우 결과를 100으로 나누고 저장하여 적절한 정밀도로 돌아갑니다.


내 컴퓨터 시스템 대학 과정의 교수가 비슷한 말을 들었던 것을 기억합니다. 가장 정확한 방법은 100을 곱하고 동전으로 저장하고 정수로 저장하고 100으로 나누어 사용자에게 표시하는 것입니다. 이것이 데이터베이스 시스템의 정확성과 성능면에서 이점이 있다고 생각합니다.
LondonAppDev

11
장점은 무엇입니까 DECIMAL? 페니를 달러로 번역 할 필요가 있으며, 어느 시점에서 잊어 버린 경우에는 화가 나 있습니다.

1
공간이 유일한 장점이지만,이 기능을 사용할 때는 더욱주의해야합니다.
Dinesh PR

4
확실하지 않은 경우 : 100을 곱한 후 정수로 감소하지 않기 때문에 분수 센트 (예 : $0.005또는 $0.12345)로 돈을 저장하는 경우 스케일 제거 방법을 사용하는 것에주의 하십시오. 값의 정밀도를 알고 있다면 가장 좋은 방법은를 사용하는 것 DECIMAL입니다. 그러나 (예에서와 같이) 정밀도를 모른다면 ... FLOAT적절할 것입니까?
Quinn Comendant

1
이 방법의 장점은 IEEE-754를 사용하여 부동 소수점 숫자를 저장하는 JavaScript와 같은 언어를 사용할 때 발생합니다. 이 사양에서는 0.1 + 0.2 === 0.3이 참임을 보증하지 않습니다. 통화를 정수로 저장하면 응용 프로그램에 이러한 종류의 오류가 발생하지 않습니다. 그러나 이것이 최선의 해결책이 아닐 수도 있습니다. 솔루션을 조사하는 동안이 페이지에 도착했지만 아직 완료되지 않았습니다.
Gary Ott

27

필요에 따라 다릅니다.

DECIMAL(10,2)일반적으로 사용하는 것으로 충분하지만 조금 더 정확한 값이 필요한 경우 설정할 수 있습니다 DECIMAL(10,4).

큰 값을 교체하면 작업하는 경우 1019.


내 돈 가치에 decimal (10,2)를 사용하고 있지만 867,000.00과 같은 것을 넣으면 867로 저장됩니다. 내가 뭘 잘못하고 있습니까?
codeinprogress

2
@codeinprogress 잘못된 로캘 / 소수 구분 기호를 사용합니까?
David Balažic 2016 년

15

애플리케이션이 최대 1 조 달러의 금액을 처리해야하는 경우 다음과 같이 작동합니다. 13,2 GAAP (일반적으로 허용되는 회계 원칙)를 준수해야하는 경우 다음을 사용하십시오. 13,4

일반적으로 산출물을 13,2로 반올림하기 전에 13,4의 금액을 합산해야합니다.


5
Bitcoin을 가져 가려면 소수점 이하 8 자리가 필요하지만 대부분의 지갑은 3 en.wikipedia.org/wiki/Bitcoin
Christian

이 답변이 사실이라고 생각하지 마십시오. opendata.stackexchange.com/a/10348/13983 @ david.ee는 그 소스를 가지고 있습니까?
Evan Carroll

@EvanCarroll david.ee에 대한 답변을 드리겠습니다. 이 기사는 소스 rietta.com/blog/2012/03/03/best-data-types-for-currencymoney-in
naXa

@naXa 링크는 GAAP에 13,4를 사용한다는 주장을 뒷받침하는 어떤 소스에서도 인용하지 않습니다. 당신이 한 것은 근거없는 주장을 똑같이하는 기사로 연결되었습니다.
iheanyi

6

실제로 이것은 프로그래머의 선호에 달려 있습니다. 나는 개인적으로 사용 numeric(15,4)을 준수하기 위해 일반적으로 인정되는 회계 원칙 ( GAAP ) .


5
"프로그래머의 환경 설정"이나 "개인적으로 사용하는"것과는 아무런 관련이 없습니다. 10 진수 기수가 필요한 문제 영역에 의해 지시됩니다. 이것은 프로그래머가 자신의 개인적 취향을 행사하게되는 문제가 아닙니다.
Lorne의 후작

3

사용해보십시오

Decimal(19,4)

이것은 일반적으로 다른 모든 DB에서도 작동합니다.


3

우리는 사용 double합니다.

* 가슴살 *

왜?

소수점 이하 자릿수에 대한 제한 없이 15 자리 숫자 나타낼 수 있기 때문 입니다 . 8 바이트를위한 모든 것!

따라서 다음을 나타낼 수 있습니다.

  • 0.123456789012345
  • 123456789012345.0

... 그리고 그 사이의 모든 것.

이것은 우리가 세계 통화를 다루고 있기 때문에 유용 하며, double발생할 수있는 소수점 이하 자릿수를 저장할 수 있습니다.

단일 double필드는 일본 엔으로 999,999,999,999,999s, 미국 달러로 9,999,999,999,999.99s, 비트 코인으로 9,999,999.99999999s를 나타낼 수 있습니다.

와 같은 작업을 시도 decimal하면 decimal(30, 15)14 바이트의 비용 이 필요 합니다.

경고

물론 사용 double에주의가없는 것은 아닙니다.

그러나 일부 사람들이 지적하는 것처럼 정확성 손실은 아닙니다 . double자체적으로 기본 10 시스템 에 대해 정확 하지는 않지만 데이터베이스에서 가져온 을 소수점 이하 자릿수 로 반올림하여 정확하게 만들 수 있습니다. 필요한 경우입니다. (예 : 출력 될 예정이고 10 진법 표현이 필요한 경우)

주의 사항은 산술을 수행 할 때마다 결과를 정규 소수점 이하 자릿수로 반올림하여 정규화해야합니다.

  1. 그것에 비교를 수행.
  2. 다시 데이터베이스에 씁니다.

또 다른 종류의 경고는 decimal(m, d)데이터베이스가 프로그램이 m숫자 보다 많은 숫자를 삽입하는 것을 방지하는 것과 달리 double. 프로그램은 사용자가 입력 한 20 자리의 값을 삽입 할 수 있으며 정확하지 않은 금액으로 자동 기록됩니다.


처음으로 이런 답을 보았습니다. Q : 데이터베이스에 1.41과 같은 부동 소수점을 쓰고 어떤 이유로 든 mysql에 1.000.000.000.000과 같은 거대한 숫자를 곱해야합니다. 반올림 결과는 정확히 1.410.000.000.000입니까?
roelleor

@roelleor 결과가 정확히 1,410,000,000,000 (천 단위 구분 기호로 쉼표) 인 경우 입력은 1.410000000000(12 자리 유효 소수점 이하 자릿수) 인 것으로 가정 하지만 1,000,000,000,000 (소수점 왼쪽에있는 유효 자릿수 13 자리)을 곱하면 최소 25 자리의 중요도. 이것은 두 배로 사용할 수있는 15를 능가하므로 디자인 측면에서는 그것이 매우 깨질 것이라고 생각합니다.
antak

2

당시이 질문은 아무도 Bitcoin 가격에 대해 생각하지 않았습니다. BTC의 경우을 사용하기에 충분하지 않을 수 있습니다 DECIMAL(15,2). 비트 코인이 $ 100,000 이상으로 상승 할 경우, DECIMAL(18,9)앱에서 cryptocurrencies를 지원 해야 합니다.

DECIMAL(18,9)MySQL에서 12 바이트의 공간을 차지합니다 (9 자리 당 4 바이트 ).


> 비트 코인은 소수점 이하 8 자리로 나눌 수 있습니다. 따라서 0.00000001 BTC는 거래에서 처리 할 수있는 최소 금액입니다. 나는 당신이 9 대신 8을 의미한다고 생각합니까?
danger89

1
알고 있지만 9는 8과 같은 디스크 공간을 차지합니다. MySQL 문서에서 : "
COREAL

죄송합니다. 이제 연락 드리겠습니다. 감사.
danger89

2

저장 BIGINT공간을 적게 사용하는 이유로 100 이상 으로 돈을 저장하면 모든 "정상적인"상황에서 의미가 없습니다.

  • GAAP와의 관계를 유지하려면 통화를 DECIMAL(13,4)
  • MySQL 매뉴얼은 저장하기 위해 9 자리 당 4 바이트가 필요하다는 것을 읽습니다 DECIMAL.
  • DECIMAL(13,4) 9 자리 숫자 + 4 자리 숫자 (소수점) => 4 + 2 바이트 = 6 바이트
  • 저장하는 데 필요한 8 바이트와 비교하십시오 BIGINT.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.