IT story

MySQL 데이터베이스에 통화 값을 저장하기위한 최상의 데이터 유형

hot-time 2020. 5. 5. 19:36
반응형

MySQL 데이터베이스에 통화 값을 저장하기위한 최상의 데이터 유형


통화 값에 가장 적합한 SQL 데이터 유형은 무엇입니까? MySQL을 사용하고 있지만 데이터베이스 독립적 유형을 선호합니다.


Decimal(19,4)대부분의 경우 와 같은 것이 일반적으로 잘 작동합니다. 저장해야하는 숫자의 요구에 맞게 스케일과 정밀도를 조정할 수 있습니다. SQL Server에서도 money표준 이 아니기 때문에 " " 를 사용하지 않는 경향이 있습니다.


한 데이터베이스에서 다른 데이터베이스로 마이그레이션하는 경우 DECIMAL (19,4) 및 DECIMAL (19,4)가 다른 것을 의미 할 수 있습니다.

( http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html )

    DBASE : 10,5 (10 정수, 10 진수 5)
    MYSQL : 15,5 (15 자리, 10 개의 정수 (15-5), 5 진수)

계산에 필요한 소수 자릿수를 계산하는 것도 중요합니다.

나는 백만 주가의 계산이 필요한 주가 응용 프로그램을 작업했습니다. 인용 된 주가는 7 자리의 정확도로 저장해야했습니다.


Assaf의 답변

돈이 얼마나 있는지에 따라 ...

flippant처럼 들리지만 실제로는 관련이 있습니다.

열 중 하나 (GrossRate)가 10 진수 (11,4)로 설정되어 있고 제품 ​​부서가 방금 놀라운 리조트에서 객실 계약을 체결했기 때문에 오늘만 요율표에 레코드를 삽입하지 못하는 문제가있었습니다. Bora Bora에서는 1 박에 수백만 대의 Pacific Franc을 판매합니다. 10 년 전에 데이터베이스 스키마가 설계되었을 때 절대로 바뀌지 않았습니다.


회계 응용 프로그램의 경우 값을 정수로 저장하는 것이 매우 일반적입니다 (일부는 유일한 방법 이라고 말할 수도 있습니다 ). 아이디어를 얻으려면 필요한 금액을 100, 1000, 10000 등으로 계산하고 필요한 금액을 100, 1000, 10000 등으로 가정하십시오. 따라서 센트 만 저장하고 안전하게 반올림 또는 내림 할 수있는 경우 100을 곱하면됩니다.이 예에서는 10023을 저장할 정수로 만듭니다. 데이터베이스의 공간을 절약하고 두 부동 소수점을 비교하는 것보다 두 정수를 비교하는 것이 훨씬 쉽습니다. 내 $ 0.02.


초 늦은 입장이지만 GAAP는 좋은 경험입니다 ..

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

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

출처 : MySQL에 화폐 가치를 저장하기위한 최상의 데이터 유형


DECIMAL(19,2)기본적으로 모든 금전적 가치에 대해 같은 것을 사용할 수 있지만 1,000 달러 미만의 값만 저장할 경우 귀중한 데이터베이스 공간을 낭비하게됩니다.

대부분의 구현에서는 DECIMAL(N,2)충분할 것입니다. 여기서 값은 N최소한 .해당 필드에 저장 될 것으로 예상되는 최대 합계 이전의 자릿수 입니다 + 5. 따라서 999999.99보다 큰 값을 저장할 것으로 예상되지 않으면 기대 값이 DECIMAL(11,2)변경 될 때까지 충분해야합니다.

당신이 원하는 경우 회계 기준의 준수를, 당신은 함께 갈 수 DECIMAL(N,4)의 값이 어디에, N전과 자릿수 적어도입니다 .혹시 그 필드에 저장 될 것으로 예상되는 가장 큰 합계가 + 7.


데이터의 특성에 따라 다릅니다. 미리 숙고해야합니다.

내 경우

  • 돈 거래 기록을 위해 부호없는 10 진수 (13,4)
    • 저장 효율 (어쨌든 소수점 각 측면에 4 바이트) 1
    • GAAP 호환
  • 집계에 대해 부호없는 10 진수 (19,4)
    • 총 수십억 건의 거래를위한 더 많은 공간이 필요합니다
    • MS Currency 데이터 유형의 준 준수는 2를 해치지 않습니다
    • 레코드 당 더 많은 공간이 필요하지만 (11 바이트-7 개의 왼쪽 및 4 개의 오른쪽) 집계에 대한 레코드 수가 적으므로 괜찮습니다 1
  • 환율 10 진수 (10,5)
    • 그들은 일반적으로 5 자리로 인용되므로 1.2345 및 12.345와 같은 값을 찾을 수 있지만 12345.67890은 찾을 수 없습니다.
    • 그것은 널리 퍼져있는 규약이지만 체계화 된 표준은 아닙니다 (적어도 나의 빠른 검색 지식)
    • 동일한 스토리지로 10 진수 (18,9)로 만들 수 있지만 데이터 유형 제한은 유용한 내장 검증 메커니즘입니다.

왜 (M, 4)?

  • 천 페니로 분리 된 통화가 있습니다
  • "Unidad de Fermento", "CLF"와 같은 4 자리의 소수점 이하 자릿수 3 , 4
  • GAAP 호환

거래

  • 낮은 정밀도 :
    • 적은 저장 비용
    • 더 빠른 계산
    • 계산 오류 위험 감소
    • 빠른 백업 및 복원
  • 더 높은 정밀도 :
    • 향후 호환성 (숫자가 증가하는 경향이 있음)
    • development time savings (you won't have to rebuild half a system when the limits are met)
    • lower risk of production failure due to insufficient storage precision

Compatible Extreme

Although MySQL lets you use decimal(65,30), 31 for scale and 30 for precision seem to be our limits if we want to leave transfer option open.

Maximum scale and precision in most common RDBMS:

            Precision   Scale
Oracle      31          31
T-SQL       38          38
MySQL       65          30
PostgreSQL  131072      16383

6, 7, 8, 9

Reasonable Extreme

  1. Why (27,4)?
    • you never know when the system needs to store Zimbabwean dollars

September 2015 Zimbabwean government stated it would exchange Zimbabwean dollars for US dollars at a rate of 1 USD to 35 quadrillion Zimbabwean dollars 5

We tend to say "yeah, sure... I won't need that crazy figures". Well, Zimbabweans used to say that too. Not to long ago.

Let's imagine you need to record a transaction of 1 mln USD in Zimbabwean dollars (maybe unlikely today, but who knows how this will look like in 10 years from now?).

  1. (1 mln USD) * (35 Quadrylion ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
  2. we need:
    • 2 digits to store "35"
    • 21 digits to store the zeros
    • 4 digits to the right of decimal point
  3. this makes decimal(27,4) which costs us 15 bytes for each entry
  4. we may add one more digit on the left at no expense - we have decimal(28,4) for 15 bytes
  5. Now we can store 10 mln USD transaction expressed in Zimbabwean dollars, or secure from another strike of hiperinflation, which hopefully won't happen

Though this may be late, but it will be helpful to someone else.From my experience and research I have come to know and accept decimal(19, 6).That is when working with php and mysql. when working with large amount of money and exchange rate

참고URL : https://stackoverflow.com/questions/628637/best-data-type-for-storing-currency-values-in-a-mysql-database

반응형