MySQL에는 다양한 숫자 데이터 타입이 존재하며, 그중 BIT와 TINYINT는 저장 용량과 표현 가능한 값의 범위가 서로 다릅니다. 이 글에서는 두 데이터 타입의 차이점을 예제와 함께 자세히 살펴보겠습니다.
BIT와 TINYINT의 기본 개념
BIT는 1비트 크기의 값을 저장할 수 있는 데이터 타입입니다. 즉, 저장할 수 있는 값은 0 또는 1뿐입니다. 예를 들어 BIT 타입 컬럼에 2를 삽입하려고 하면 MySQL은 오류를 발생시킵니다.
반면 TINYINT는 8비트(1바이트) 크기의 값을 저장할 수 있는 데이터 타입입니다. 부호가 있는(signed) 경우 저장할 수 있는 최대값은 127입니다. 따라서 987처럼 127을 초과하는 값은 저장할 수 없으며, 삽입을 시도하면 MySQL은 범위 초과 오류를 발생시킵니다.
테스트 환경 확인
이번 예제는 MySQL 8.0.12 버전에서 진행합니다. 먼저 설치된 MySQL 버전을 확인해 보겠습니다.
mysql> select version();
실행 결과는 다음과 같습니다.
+-----------+ | version() | +-----------+ | 8.0.12 | +-----------+ 1 row in set (0.00 sec)
BIT 타입 사용 예제
BIT 타입 테이블 생성
BIT 타입 컬럼을 가진 테이블을 생성합니다.
mysql> create table BitDemo -> ( -> Id BIT -> ); Query OK, 0 rows affected (0.56 sec)
정상적인 값 삽입
'BitDemo' 테이블에 1과 0을 차례로 삽입합니다.
mysql> insert into BitDemo values(1); Query OK, 1 row affected (0.13 sec) mysql> insert into BitDemo values(0); Query OK, 1 row affected (0.33 sec)
허용 범위 초과 시 오류 발생
BIT 타입에 2를 삽입하려고 하면 오류가 발생합니다.
mysql> insert into BitDemo values(2); ERROR 1406 (22001): Data too long for column 'Id' at row 1
BIT는 1비트만 저장할 수 있으므로 2라는 값은 표현할 수 없어 위와 같은 오류가 출력됩니다.
TINYINT 타입 사용 예제
TINYINT 타입 테이블 생성
TINYINT 타입 컬럼을 가진 테이블을 생성합니다.
mysql> create table TinyIntDemo -> ( -> Id TINYINT -> ); Query OK, 0 rows affected (0.69 sec)
정상적인 값 삽입
TINYINT는 -128부터 127까지의 값을 저장할 수 있습니다. 123, 97, 127을 삽입해 보겠습니다.
mysql> insert into TinyIntDemo values(123); Query OK, 1 row affected (0.17 sec) mysql> insert into TinyIntDemo values(97); Query OK, 1 row affected (0.15 sec) mysql> insert into TinyIntDemo values(127); Query OK, 1 row affected (0.16 sec)
허용 범위 초과 시 오류 발생
127을 초과하는 값을 삽입하려고 하면 모두 오류가 발생합니다.
mysql> insert into TinyIntDemo values(9876); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(987); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(255); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(254); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(200); ERROR 1264 (22003): Out of range value for column 'Id' at row 1 mysql> insert into TinyIntDemo values(199); ERROR 1264 (22003): Out of range value for column 'Id' at row 1
부호 있는 TINYINT의 최대 저장값은 127이므로, 그 이상의 어떤 값도 저장할 수 없습니다.
저장된 데이터 확인
SELECT 명령으로 정상적으로 삽입된 레코드를 조회해 보겠습니다.
mysql> select *from TinyIntDemo;
실행 결과는 다음과 같습니다.
+------+ | Id | +------+ | 123 | | 97 | | 127 | +------+ 3 rows in set (0.00 sec)
정리: BIT vs TINYINT 비교
두 데이터 타입의 핵심 차이를 요약하면 다음과 같습니다.
- BIT: 1비트만 저장 가능하며, 값은 0 또는 1로 제한됩니다. 참/거짓 같은 불리언 성격의 데이터나 플래그 저장에 적합합니다.
- TINYINT: 8비트(1바이트)를 사용하며, 부호 있는 경우 -128~127, 부호 없는 UNSIGNED 옵션 사용 시 0~255까지 저장할 수 있습니다.
따라서 단순히 참/거짓 여부만 저장한다면 BIT가 메모리를 절약할 수 있고, 작은 범위의 정수를 다루어야 한다면 TINYINT가 적합합니다. 참고로 MySQL에서는 TINYINT(1)를 불리언(Boolean)의 별칭처럼 사용하기도 하므로, 상황에 맞게 선택하는 것이 중요합니다.