MySQL 데이터 타입의 종류와 특징 완벽 가이드

1. 정수 타입 (Integer Types)

MySQL은 저장 공간과 수의 범위를 효율적으로 관리하기 위해 다양한 정수 타입을 제공합니다. 각 타입은 부호가 있는(SIGNED) 상태와 부호가 없는(UNSIGNED) 상태로 선언할 수 있습니다.

타입 바이트(Bit) SIGNED 범위 UNSIGNED 범위
TINYINT 1 (8) -128 ~ 127 0 ~ 255
SMALLINT 2 (16) -32,768 ~ 32,767 0 ~ 65,535
MEDIUMINT 3 (24) -8,388,608 ~ 8,388,607 0 ~ 16,777,215
INT 4 (32) 약 -21억 ~ 21억 0 ~ 약 42억
BIGINT 8 (64) -2^63 ~ 2^63-1 0 ~ 2^64-1
  • SIGNED (기본값): 가장 왼쪽 비트를 부호 비트로 사용하여 음수와 양수를 모두 표현합니다.
  • UNSIGNED: 모든 비트를 수치 표현에 사용하여 양수의 범위를 두 배로 늘립니다.

2. 부동 소수점과 고정 소수점

실수를 저장할 때는 정밀도 요구 사항에 따라 부동 소수점(Floating-point)이나 고정 소수점(Fixed-point) 타입을 선택해야 합니다.

타입 바이트 특징
FLOAT 4 단정밀도 부동 소수점 (약 7자리 정밀도)
DOUBLE 8 배정밀도 부동 소수점 (약 15~16자리 정밀도)
DECIMAL(M, D) 가변 고정 소수점. 금액 등 정확한 계산이 필요한 경우 사용

DECIMAL(M, D)에서 M은 전체 자릿수(Precision)를, D는 소수점 이하 자릿수(Scale)를 의미합니다. 내부적으로 문자열 방식으로 저장되어 이진수 변환 오차가 발생하지 않습니다.

3. 날짜 및 시간 타입

날짜와 시간을 다루는 타입은 용도에 따라 형식이 구분됩니다.

타입 형식 범위 용도
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31 날짜 정보만 저장
TIME HH:MM:SS -838:59:59 ~ 838:59:59 시간 또는 시간 간격
DATETIME YYYY-MM-DD HH:MM:SS 1000-01-01 ~ 9999-12-31 날짜와 시간 (타임존 독립적)
TIMESTAMP YYYY-MM-DD HH:MM:SS 1970-01-01 ~ 2038-01-19 타임존에 종속적인 시간 정보

주요 시간 함수 및 연산

-- 현재 날짜 및 시간 조회
SELECT CURDATE();           -- 2024-05-20
SELECT NOW();               -- 2024-05-20 14:30:00

-- 날짜 더하기 및 빼기
SELECT DATE_ADD(NOW(), INTERVAL 10 DAY);    -- 10일 후
SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH);   -- 3개월 전

-- 포맷 변환
SELECT DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %H시 %i분');

자동 시간 업데이트 설정

데이터의 생성 시간과 수정 시간을 자동으로 관리하려면 DEFAULTON UPDATE 제약 조건을 활용합니다.

CREATE TABLE user_logs (
    log_id INT AUTO_INCREMENT PRIMARY KEY,
    action_name VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

4. 문자열 타입

문자열 데이터는 길의의 가변 여부에 따라 CHARVARCHAR로 나뉩니다.

  • CHAR(n): 고정 길이. 지정된 길이보다 짧은 문자열이 들어오면 공백을 채워 저장합니다. 읽기 속도가 빠릅니다.
  • VARCHAR(n): 가변 길이. 실제 데이터의 길이에 맞춰 저장 공간을 사용합니다. 공간 효율성이 좋습니다.
특성 CHAR VARCHAR
저장 방식 고정 크기 데이터 길이 + 길이 정보(1~2바이트)
공간 효율 낮음 높음
성능 빠름 (정적 메모리 할당) 상대적으로 느림

5. 데이터 범위 초과 및 오버플로 처리

데이터 타입이 허용하는 임계치를 벗어날 경우 MySQL의 설정(SQL Mode)에 따라 동작이 달라집니다.

  • 범위 초과 (Out of Range): 입력값이 데이터 타입의 최소/최대 범위를 벗어난 경우입니다.
    • Strict Mode인 경우: 오류가 발생하며 쿼리가 실패합니다.
    • Non-strict Mode인 경우: 가장 가까운 경계값으로 잘려서 저장되고 경고(Warning)가 발생합니다.
  • 오버플로 (Overflow): 연산 과정에서 결과값이 타입의 표현 용량을 초과하는 경우입니다.
-- 예시: TINYINT UNSIGNED(최대 255)에 연산 수행
-- 결과가 255를 넘으면 SQL 모드에 따라 에러 또는 최대값으로 처리됨
SELECT CAST(200 AS UNSIGNED) + CAST(100 AS UNSIGNED);

태그: MySQL Database SQL DataTypes backend

7월 20일 16:22에 게시됨