BIGINT(8)의 숫자 '8'의 의미
많은 개발자가 BIGINT(8)의 숫자 8을 저장 크기로 오해하곤 하지만, 실제로 이 숫자는 표시 너비(display width)를 나타냅니다. 즉, 데이터가 화면에 어떻게 출력될지를 결정할 뿐, 실제 저장 용량이나 값의 범위에는 아무런 영향을 주지 않습니다.
BIGINT의 실제 크기와 값 범위
BIGINT는 항상 8바이트(64비트)를 차지합니다. 따라서 괄호 안의 숫자와 관계없이 저장 공간은 동일하게 유지됩니다.
- 부호 있는(SIGNED) 범위: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
- 부호 없는(UNSIGNED) 범위: 0 ~ 18,446,744,073,709,551,615
ZEROFILL을 활용한 BIGINT(8) 동작 확인
BIGINT(8)가 실제로 어떻게 작동하는지 이해하기 위해, ZEROFILL 옵션과 함께 테스트 테이블을 생성해 보겠습니다.
mysql> create table BigIntDemo8
-> (
-> Number1 BIGINT(8) not null,
-> Number2 BIGINT(8) unsigned zerofill not null
-> );
Query OK, 0 rows affected (0.59 sec)
이제 두 컬럼에 각각 레코드를 삽입합니다.
mysql> insert into BigIntDemo8 values(1,1);
Query OK, 1 row affected (0.14 sec)
mysql> insert into BigIntDemo8 values(11,11);
Query OK, 1 row affected (0.24 sec)
mysql> insert into BigIntDemo8 values(111,111);
Query OK, 1 row affected (0.14 sec)
mysql> insert into BigIntDemo8 values(1111,1111);
Query OK, 1 row affected (0.18 sec)
mysql> insert into BigIntDemo8 values(11111,11111);
Query OK, 1 row affected (0.10 sec)
mysql> insert into BigIntDemo8 values(111111,111111);
Query OK, 1 row affected (0.21 sec)
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from BigIntDemo8;
실행 결과는 다음과 같습니다.
+---------+----------+
| Number1 | Number2 |
+---------+----------+
| 1 | 00000001 |
| 11 | 00000011 |
| 111 | 00000111 |
| 1111 | 00001111 |
| 11111 | 00011111 |
| 111111 | 00111111 |
+---------+----------+
6 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 일반 컬럼인 Number1은 입력한 값이 그대로 출력되지만, zerofill 옵션이 적용된 Number2 컬럼은 지정된 표시 너비인 8자리보다 짧은 값 앞에 0이 채워져 출력되는 것을 확인할 수 있습니다. 이처럼 BIGINT(8)의 '8'은 단순히 출력 형식을 조정하는 옵션일 뿐입니다.
참고로 MySQL 8.0.17 버전부터는 정수 타입의 표시 너비 속성이 공식적으로 지원 중단(deprecated)되었으므로, 새 프로젝트에서는 이 기능에 의존하지 않는 것이 좋습니다.