MySQL에서 TINYINT 타입에 대해 알아야 할 핵심 사항을 먼저 정리해 보겠습니다.
- TINYINT 타입은 1바이트, 즉 8비트를 차지합니다.
- TINYINT(N)에서 N은 표시하고자 하는 디스플레이 폭(display width)을 의미합니다.
예를 들어, TINYINT(1)는 디스플레이 폭이 1이라는 뜻일 뿐입니다.
TINYINT의 최솟값과 최댓값
그렇다면 TINYINT가 저장할 수 있는 값의 범위는 어떻게 될까요?
TINYINT의 최댓값 = (2^(8-1) - 1) = 127 TINYINT의 최솟값 = -(2^(8-1)) = -128
즉, 저장 가능한 값의 범위는 -128부터 127까지입니다. 여기서 중요한 점은 TINYINT(1)처럼 괄호 안의 숫자가 최댓값이나 최솟값에는 전혀 영향을 주지 않는다는 것입니다.
직접 확인해 보기
실제로 테스트를 통해 이 사실을 검증해 보겠습니다.
1. TINYINT(1) 컬럼으로 테이블 생성
먼저 TINYINT(1)로 설정된 컬럼을 가진 테이블을 생성합니다.
mysql> create table Display -> ( -> rangeOfId tinyint(1) -> ); Query OK, 0 rows affected (0.67 sec)
2. 범위를 벗어난 값 삽입 시 오류 발생
최댓값과 최솟값의 범위를 벗어나는 값을 삽입하면 어떻게 될까요? 오류가 발생합니다.
mysql> insert into Display values(128); ERROR 1264 (22003): Out of range value for column 'rangeOfId' at row 1
128은 TINYINT의 최댓값인 127을 초과하기 때문에 "범위를 벗어난 값"이라는 오류가 반환됩니다.
3. 유효한 범위 내의 값 삽입
이번에는 정상 범위 내의 값들을 삽입해 보겠습니다.
mysql> insert into Display values(127); Query OK, 1 row affected (0.18 sec) mysql> insert into Display values(-128); Query OK, 1 row affected (0.20 sec)
최댓값인 127과 최솟값인 -128 모두 문제없이 삽입되었습니다.
4. 결과 확인
SELECT 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from Display;
출력 결과
+-----------+ | rangeOfId | +-----------+ | 127 | | -128 | +-----------+ 2 rows in set (0.00 sec)
결론
TINYINT(1)의 숫자 1은 단지 화면에 표시되는 자릿수를 의미할 뿐이며, 실제 저장 가능한 값의 범위(-128 ~ 127)에는 아무런 영향을 미치지 않습니다. 참고로 MySQL 8.0.17 버전부터는 이러한 디스플레이 폭 지정이 더 이상 권장되지 않으며, 불리언(Boolean) 값을 다룰 때는 TINYINT(1)가 관례적으로 사용되지만 0과 1 외의 값도 저장될 수 있다는 점을 기억하는 것이 좋습니다.