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)
- 환율 10 진수 (10,5)
- 그들은 일반적으로 5 자리로 인용되므로 1.2345 및 12.345와 같은 값을 찾을 수 있지만 12345.67890은 찾을 수 없습니다.
- 그것은 널리 퍼져있는 규약이지만 체계화 된 표준은 아닙니다 (적어도 나의 빠른 검색 지식)
- 동일한 스토리지로 10 진수 (18,9)로 만들 수 있지만 데이터 유형 제한은 유용한 내장 검증 메커니즘입니다.
왜 (M, 4)?
거래
- 낮은 정밀도 :
- 적은 저장 비용
- 더 빠른 계산
- 계산 오류 위험 감소
- 빠른 백업 및 복원
- 더 높은 정밀도 :
- 향후 호환성 (숫자가 증가하는 경향이 있음)
- 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
Reasonable Extreme
- 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 mln USD) * (35 Quadrylion ZWL) = ( 10^6 ) * (35 * 10^15) = 35 * 10^21
- we need:
- 2 digits to store "35"
- 21 digits to store the zeros
- 4 digits to the right of decimal point
- this makes decimal(27,4) which costs us 15 bytes for each entry
- we may add one more digit on the left at no expense - we have decimal(28,4) for 15 bytes
- 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
'IT story' 카테고리의 다른 글
왜 Func인가 (0) | 2020.05.05 |
---|---|
서식을 손상시키지 않고 CSV 열에 쉼표를 포함시키는 방법이 있습니까? (0) | 2020.05.05 |
mysql 삽입 쿼리에서 새 레코드 기본 키 ID를 가져 오시겠습니까? (0) | 2020.05.05 |
파이썬에서 정규식 문자열 이스케이프 (0) | 2020.05.05 |
vim에 어떤 파일 형식이로드되어 있는지 확인 (0) | 2020.05.05 |