MySQL에서 BOOLEAN과 TINYINT의 관계
MySQL에서 BOOLEAN과 BOOL 데이터 타입은 모두 TINYINT(1)와 완전히 동일합니다. BOOLEAN이나 BOOL로 컬럼을 생성하면 MySQL이 내부적으로 이를 자동으로 TINYINT(1)로 변환하는데, 그 이유는 BOOLEAN과 BOOL이 사실상 TINYINT(1)의 동의어(synonym)에 불과하기 때문입니다.
또한 MySQL에서 TRUE는 1, FALSE는 0의 상수 리터럴로 처리되므로, 실질적인 참/거짓 판단은 0이 아닌 모든 값을 '참'으로 간주하는 방식으로 이루어집니다.
BOOLEAN 데이터 타입으로 테이블 생성하기
먼저 BOOLEAN 데이터 타입을 사용하는 테이블을 생성해 보겠습니다.
mysql> create table BooleanDemo -> ( -> IsOn BOOLEAN -> ); Query OK, 0 rows affected (0.58 sec)
테이블이 생성되었다면, 다음 쿼리로 실제 내부 구조를 확인할 수 있습니다.
mysql> show create table BooleanDemo;
출력 결과
CREATE TABLE `booleandemo` ( `IsOn` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
출력 결과에서 알 수 있듯이, BOOLEAN으로 선언한 컬럼이 실제로는 tinyint(1)로 정의되어 있는 것을 확인할 수 있습니다.
BOOL 데이터 타입도 결과는 같다
BOOL 데이터 타입 역시 마찬가지입니다. 동일한 방식으로 테이블을 생성해 보겠습니다.
mysql> create table BOOLDemo -> ( -> validUser BOOL -> ); Query OK, 0 rows affected (0.61 sec)
생성된 테이블의 내부 구조를 확인합니다.
mysql> show create table BOOLDemo;
출력 결과
CREATE TABLE `booldemo` ( `validUser` tinyint(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
이번에도 BOOL로 선언된 컬럼이 tinyint(1)로 변환된 것을 볼 수 있습니다.
그렇다면 무엇을 사용해야 할까?
세 가지 표기법 모두 저장 구조와 성능 면에서 완전히 동일하므로 기능적인 차이는 없습니다. 다만 코드 가독성과 의도 전달 측면에서 다음과 같이 선택하는 것이 좋습니다.
- 참/거짓 의미가 명확한 컬럼: BOOLEAN 또는 BOOL을 사용하면 개발자의 의도가 명확히 드러납니다.
- 값의 범위가 중요한 경우: TINYINT(1)를 직접 명시하면 실제 저장되는 숫자형 특성을 강조할 수 있습니다.
결론적으로 MySQL에서 BOOLEAN, BOOL, TINYINT(1)는 같은 것이므로, 팀의 코딩 컨벤션에 맞춰 일관성 있게 사용하는 것이 가장 바람직합니다.