본문 바로가기
개발&프로그래밍

[MySQL] TINYINT vs BIT - 어떤 것을 사용해야 할까?

by 재아군 2025. 2. 7.

[MySQL] TINYINT vs BIT - 어떤 것을 사용해야 할까?

MySQL에서 boolean 값을 저장할 때 주로 사용되는 TINYINT와 BIT 타입에 대해 비교 분석해보자.

 

 

데이터 타입 특징

TINYINT

-- TINYINT 정의
CREATE TABLE test_tinyint (
    id INT PRIMARY KEY,
    is_active TINYINT(1)
);

-- 데이터 삽입
INSERT INTO test_tinyint VALUES (1, 1);  -- true
INSERT INTO test_tinyint VALUES (2, 0);  -- false
  • 저장 공간: 1바이트
  • 값 범위: -128 ~ 127 (TINYINT SIGNED) 또는 0 ~ 255 (TINYINT UNSIGNED)
  • boolean 용도로 사용 시 주로 TINYINT(1) 사용
  • 실제 저장되는 값: 0 또는 1

 

BIT

-- BIT 정의
CREATE TABLE test_bit (
    id INT PRIMARY KEY,
    is_active BIT(1)
);

-- 데이터 삽입
INSERT INTO test_bit VALUES (1, b'1');  -- true
INSERT INTO test_bit VALUES (2, b'0');  -- false
  • 저장 공간: M비트 (BIT(M)에서 M의 값)
  • 값 범위: 0 또는 1 (BIT(1)의 경우)
  • 비트 단위 연산 가능
  • 실제 저장되는 값: 비트값

 

 

주요 차이점

 

1. 가독성

-- TINYINT 조회
SELECT * FROM test_tinyint WHERE is_active = 1;

-- BIT 조회
SELECT * FROM test_bit WHERE is_active = b'1';
-- 또는
SELECT *, is_active + 0 FROM test_bit; -- 숫자로 변환하여 조회

 

 

2. 성능

-- 인덱스 생성
CREATE INDEX idx_active_tinyint ON test_tinyint(is_active);
CREATE INDEX idx_active_bit ON test_bit(is_active);

 

  • TINYINT가 일반적으로 더 나은 성능을 보임
  • 데이터베이스 도구에서의 표시가 TINYINT가 더 직관적
  1. 프로그래밍 언어와의 호환성
    // Java에서 사용 예
    // TINYINT의 경우
    boolean isActive = resultSet.getBoolean("is_active");  // 자동 변환
    
    // BIT의 경우
    boolean isActive = resultSet.getByte("is_active") == 1; // 추가 변환 필요할 수 있음

 

사용 권장사항

 

TINYINT 사용이 권장되는 경우

 


-- Boolean flag로 사용
CREATE TABLE users (
    id INT PRIMARY KEY,
    is_active TINYINT(1) DEFAULT 1,
    is_deleted TINYINT(1) DEFAULT 0,
    email_verified TINYINT(1) DEFAULT 0
);

BIT 사용이 권장되는 경우

-- 비트 연산이 필요한 경우
CREATE TABLE permissions (
    id INT PRIMARY KEY,
    access_flags BIT(8)  -- 8개의 권한을 비트로 관리
);

 

 

실제 사용 예시

 

TINYINT 활용

-- 일반적인 boolean 플래그
CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(200),
    is_published TINYINT(1) DEFAULT 0,
    is_featured TINYINT(1) DEFAULT 0,
    created_at TIMESTAMP
);

-- 조회 쿼리
SELECT * FROM articles WHERE is_published = 1 AND is_featured = 1;

 

BIT 활용

-- 비트 플래그 활용
CREATE TABLE user_settings (
    user_id INT PRIMARY KEY,
    preferences BIT(8),  -- 8가지 설정을 비트로 관리
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 비트 연산 쿼리
SELECT user_id FROM user_settings WHERE preferences & b'10000000' = b'10000000';

 

결론 및 권장사항

  1. 일반적인 boolean 값 저장
    • TINYINT(1) 사용 권장
    • 더 나은 도구 지원
    • 더 직관적인 쿼리 작성
  2. 비트 연산이 필요한 경우
    • BIT 사용 권장
    • 효율적인 비트 단위 연산
    • 저장 공간 최적화 가능

 

댓글