✅ 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()로 출력 포맷 가공 가능.
- 예제 테이블처럼 데이터 제약조건은 설계 초기에 반영해야 유지보수 편함.