프로그래밍/MSSQL

[MSSQL] 데이터 타입 (Data Type) 완전 정복

KRLAND 2025. 3. 26. 16:43

✅ MSSQL 데이터 타입 완전정복: 타입별 설명 + 예제 + 테이블 설계 + 최적화 팁


📌 1. 정수형 (정확한 수치)

타입 범위 예제 용도 최적화
tinyint 0~255 age TINYINT 나이, 등급 공간 최적
smallint -32K~32K year SMALLINT 연도 int보다 작음
int 약 ±21억 views INT 조회수 등 기본 정수 기본형
bigint ±900경 total_sales BIGINT 누적 금액, 카운터 대량 처리용

최적화 팁: 범위 작은 데이터는 tinyint, smallint 적극 사용 → 저장공간 절약 + 인덱스 빠름


📌 2. 소수/금액형

타입 예시 설명 용도
decimal(10,2) price DECIMAL(10,2) 정수 8자리 + 소수 2자리 가격, 정밀도
money salary MONEY 통화 전용 형식 급여, 금액
float, real score FLOAT 근사치 부동소수 과학, 센서 등

최적화 팁: 금액엔 decimal 추천 (money는 오차 있음), float는 정확도가 덜 중요할 때만 사용


📌 3. 문자열 타입

타입 예시 설명 용도
char(10) code CHAR(10) 고정 길이 주민번호 등 고정값
varchar(100) title VARCHAR(100) 가변 문자열 게시글 제목
varchar(max) content VARCHAR(MAX) 긴 텍스트 게시판 본문
nvarchar(100) name NVARCHAR(100) 유니코드 문자 한글, 다국어
text (폐기 예정) 긴 문자열 ❌ 사용 지양

최적화 팁: char는 잘 안 씀, 가변 문자열은 varchar, 다국어는 반드시 nvarchar


📌 4. 날짜/시간

타입 예시 설명 용도
date birth DATE 날짜만 저장 생년월일
time(0~7) start TIME(0) 시간만 저장 영업시작시간
datetime created DATETIME 날짜 + 시간 (3ms 정밀도) 기본형
datetime2(3) updated DATETIME2(3) 정밀한 날짜시간 권장 사용
datetimeoffset(3) event_time DATETIMEOFFSET(3) +시간대 글로벌 시간

최적화 팁: 신규 개발이면 datetime2나 datetimeoffset 권장 (datetime은 옛날 방식)


📌 5. 이진 / 특수 타입

타입 예시 설명 용도
varbinary(max) file VARBINARY(MAX) 파일 저장 이미지, 첨부
uniqueidentifier user_id UNIQUEIDENTIFIER UUID/GUID 전역 식별자
xml config XML 구조적 문자열 저장 설정 값
sql_variant 다양한 타입 허용 특수한 상황에서  

🧱 테이블 설계 예시

CREATE TABLE Users
(
    UserID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,
    UserName NVARCHAR(100) NOT NULL,
    Email VARCHAR(100) UNIQUE,
    Age TINYINT CHECK (Age BETWEEN 0 AND 120),
    IsActive BIT DEFAULT 1,
    CreatedAt DATETIME2 DEFAULT SYSDATETIME()
);
CREATE TABLE Orders
(
    OrderID INT IDENTITY PRIMARY KEY,
    UserID UNIQUEIDENTIFIER FOREIGN KEY REFERENCES Users(UserID),
    OrderDate DATE,
    TotalAmount DECIMAL(10, 2) CHECK (TotalAmount >= 0),
    Status CHAR(1) CHECK (Status IN ('P', 'C', 'F')), -- P=진행, C=완료, F=취소
    InvoiceFile VARBINARY(MAX) NULL
);

🚀 성능 & 최적화 기준 요약

전략 설명
정확한 타입 사용 예: tinyint, smallint, datetime2, nvarchar
CHECK 제약조건 적극 사용 값의 범위 및 유효성 사전에 차단
NOT NULL 지정 NULL 남발 방지 → 쿼리 성능 ↑
인덱스 구성 자주 조회되는 컬럼, JOIN 대상, 조건절 컬럼에 인덱스 설정
VARCHAR 길이 지정 max 남용 ❌, 실제 예상 최대값만큼만
GUID PRIMARY KEY는 비추 클러스터형 인덱스 순서 깨짐 → 성능 저하 (대신 sequential GUID 고려)
데이터 정규화 중복 제거 및 무결성 유지 (JOIN이 많아지면 일부 비정규화도 고려)

📎 활용 예제 쿼리

-- 1. 사용자 생성
INSERT INTO Users (UserName, Email, Age)
VALUES (N'홍길동', 'hong@test.com', 30);

-- 2. 주문 등록
INSERT INTO Orders (UserID, OrderDate, TotalAmount, Status)
VALUES (
    'F2C9E6C1-8F33-48AF-9FAF-735A1A8CDEAD',
    GETDATE(),
    24900.50,
    'P'
);

-- 3. 사용자 조회
SELECT UserName, Email, CreatedAt
FROM Users
WHERE IsActive = 1;

-- 4. 날짜 포맷 출력
SELECT FORMAT(OrderDate, 'yyyy-MM-dd') AS OrderDateFormatted
FROM Orders;

 


✨ 정리 요약

  • MSSQL은 다양한 데이터 타입을 제공하므로 정확한 목적에 따라 타입을 잘 선택해야 함.
  • varchar, nvarchar, decimal, datetime2는 가장 많이 쓰이는 핵심 타입.
  • 성능을 위해 범위 맞는 타입, NOT NULL, CHECK, 인덱스 꼭 고려하기.
  • FORMAT(), CONVERT()로 출력 포맷 가공 가능.
  • 예제 테이블처럼 데이터 제약조건은 설계 초기에 반영해야 유지보수 편함.