Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL DECIMAL(x,0)의 범위는 얼마나 될까? BIGINT보다 큰 숫자 저장하기

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 오류가 발생한다는 점을 기억해 두세요.