MySQL에서 금액과 같은 돈(money) 값을 저장할 때는 DECIMAL(value1, value2) 타입을 사용하는 것이 가장 좋습니다. 여기서 value1은 소수점 이하 자릿수(value2)를 포함한 전체 유효 숫자의 총 자릿수를 의미하며, value2는 소수점 아래에 허용되는 자릿수를 지정합니다.
왜 DECIMAL을 사용해야 할까요?
FLOAT나 DOUBLE 같은 부동소수점 타입은 근사값으로 저장되기 때문에 금융 계산에서 미세한 오차가 발생할 수 있습니다. 반면 DECIMAL은 정확한 고정소수점 값을 저장하므로 금액 처리에는 DECIMAL이 표준적으로 권장됩니다.
개념을 이해하기 위해 아래 단계별 예제를 살펴보겠습니다.
1단계: 테이블 생성
먼저 CREATE 명령어로 테이블을 생성합니다.
mysql> CREATE table MoneyDemo
-> (
-> Id int,
-> Money decimal(10,2)
-> );
Query OK, 0 rows affected (0.46 sec)
위 명령에서 볼 수 있듯이 decimal(10,2)로 선언된 컬럼은 전체 10자리 숫자만 허용하며, 그중 소수점 아래는 최대 2자리까지만 저장할 수 있습니다. 즉, 소수점 앞 8자리 + 소수점 뒤 2자리 구성입니다.
2단계: 데이터 삽입
테이블 생성 후 INSERT 명령어로 몇 개의 레코드를 삽입합니다.
mysql> INSERT into MoneyDemo values(1,98777445.50);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT into MoneyDemo values(2,12345678.00);
Query OK, 1 row affected (0.18 sec)
mysql> INSERT into MoneyDemo values(3,88888888.50);
Query OK, 1 row affected (0.20 sec)
3단계: 범위 초과 시 오류 확인
위 컬럼에 10자리를 초과하는 값을 삽입하면 다음과 같이 오류 메시지가 발생합니다.
mysql> INSERT into MoneyDemo values(3,8888888888.50);
ERROR 1264 (22003): Out of range value for column 'Money' at row 1
이처럼 DECIMAL 타입은 지정된 자릿수를 벗어나는 값을 허용하지 않으므로, 잘못된 금액 데이터가 저장되는 것을 사전에 방지할 수 있습니다.
4단계: 저장된 데이터 조회
SELECT 문을 사용하면 테이블의 모든 레코드를 확인할 수 있습니다.
mysql> SELECT * from MoneyDemo;
실행 결과는 다음과 같습니다.
+------+-------------+
| Id | Money |
+------+-------------+
| 1 | 98777445.50 |
| 2 | 12345678.00 |
| 3 | 88888888.50 |
+------+-------------+
3 rows in set (0.00 sec)
정리
MySQL에서 금액 값을 저장할 때는 정확성이 보장되는 DECIMAL(M, D) 타입을 사용하는 것이 가장 안전합니다. 일반적인 화폐 단위라면 decimal(10,2) 또는 필요에 따라 더 큰 자릿수(예: decimal(15,2))를 지정하여 사용하면 됩니다.