데이터베이스에서 가격(PRICE) 필드를 INT나 FLOAT 타입으로 저장할 필요는 없습니다. 대신 DECIMAL() 데이터 타입을 사용하는 것이 올바른 방법입니다.
대부분의 경우 부동 소수점 숫자는 정수 형태로 표현되며, 내부적으로 DECIMAL() 데이터 타입으로 변환됩니다. 따라서 PRICE처럼 금액을 저장하는 필드에는 항상 DECIMAL() 데이터 타입을 사용하는 것이 좋습니다.
DECIMAL의 기본 문법
DECIMAL(M,D);
- M: 전체 자릿수(TotalNumberOfDigit), 즉 숫자의 총 길이
- D: 소수점 이하 자릿수(NumberOfDigitAfterDecimalPoint)
DECIMAL 타입으로 테이블 생성하기
개념을 이해하기 위해 PRICE 필드를 DECIMAL 데이터 타입으로 선언한 테이블을 만들어 보겠습니다. 쿼리는 다음과 같습니다.
mysql> create table Decimal_Demo -> ( -> Id int NOT NULL AUTO_INCREMENT, -> PRICE DECIMAL(18,2), -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (1.63 sec)
위 예제에서 DECIMAL(18,2)은 전체 18자리 중 소수점 이하 2자리를 허용한다는 의미입니다. 이제 INSERT 명령으로 몇 개의 레코드를 삽입해 보겠습니다.
데이터 삽입하기
mysql> insert into Decimal_Demo(PRICE) values(99999999999999.99); Query OK, 1 row affected (0.11 sec) mysql> insert into Decimal_Demo(PRICE) values(10000000000000.99); Query OK, 1 row affected (0.36 sec)
저장된 데이터 조회하기
SELECT 문을 사용하여 테이블의 모든 레코드를 확인할 수 있습니다.
mysql> select *from Decimal_Demo;
실행 결과는 다음과 같습니다.
+----+-------------------+ | Id | PRICE | +----+-------------------+ | 1 | 99999999999999.99 | | 2 | 10000000000000.99 | +----+-------------------+ 2 rows in set (0.00 sec)
출력 결과에서 볼 수 있듯이, DECIMAL 타입을 사용하면 큰 금액 값도 소수점 이하 자릿수까지 정확하게 손실 없이 저장됩니다. 반면 FLOAT나 DOUBLE 타입은 근사값을 저장하기 때문에 금융 데이터 처리 시 오차가 발생할 수 있으므로, 가격 정보에는 DECIMAL 사용을 권장합니다.