MySQL에서 DECIMAL 데이터 타입은 INTEGER나 BIGINT보다 훨씬 넓은 범위의 숫자를 저장할 수 있습니다. BIGINT가 저장할 수 있는 최대값은 18446744073709551615(약 1.8×10¹⁹)인 반면, DECIMAL은 최대 DECIMAL(65,0)까지 정의할 수 있어 65자리의 9로 이루어진 숫자를 저장할 수 있습니다.
DECIMAL의 저장 공간 계산 방식
DECIMAL은 숫자를 바이트 단위로 저장하며, 필요한 저장 공간은 다음과 같은 공식으로 계산됩니다. DECIMAL(x,0) 형태일 때:
StorageRequirementInBytes = (x/9) + remaining; WHERE remaining = round_up( (x%9) / 2 )
따라서 DECIMAL(65,0)이 실제로 저장할 수 있는 최대값은 다음과 같습니다.
99999999999999999999999999999999999999999999999999999999999999999
실습: DECIMAL(65,0) 테이블 만들기
위 내용을 직접 확인해 보겠습니다. 먼저 테이블을 생성하는 쿼리는 다음과 같습니다.
mysql> create table DecimalDemo -> ( -> UserId DECIMAL(65,0) -> ); Query OK, 0 rows affected (0.62 sec)
이제 INSERT 명령으로 레코드를 삽입해 보겠습니다. 소수점이 붙은 값(.0)도 정상적으로 처리되는 것을 확인할 수 있습니다.
mysql> insert into DecimalDemo values(99999999999999999999999999999999999999999999999999999999999999999); Query OK, 1 row affected (0.16 sec) mysql> insert into DecimalDemo values(99999999999999999999999999999999999999999999999999999999999999999.0); Query OK, 1 row affected (0.28 sec)
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DecimalDemo;
출력 결과
+-------------------------------------------------------------------+ | UserId | +-------------------------------------------------------------------+ | 99999999999999999999999999999999999999999999999999999999999999999 | | 99999999999999999999999999999999999999999999999999999999999999999 | +-------------------------------------------------------------------+ 2 rows in set (0.00 sec)
정밀도 65 초과 시 발생하는 오류
테이블 생성 시 정밀도(precision)를 66으로 지정하면 아래와 같은 오류가 발생합니다. MySQL에서 DECIMAL의 최대 정밀도는 65로 제한되어 있기 때문입니다.
mysql> create table DecimalDemo1 -> ( -> UserId DECIMAL(66,0) -> ); ERROR 1426 (42000): Too-big precision 66 specified for 'UserId'. Maximum is 65.
정리
MySQL의 DECIMAL 타입은 최대 정밀도 65까지 지원하므로, BIGINT의 한계를 넘어서는 매우 큰 정수를 다룰 때 유용합니다. 다만 정밀도를 66 이상으로 설정하면 ERROR 1426 오류가 발생한다는 점을 기억해 두세요.