SQL Server에서 사용할 수 있는 데이터 형식은 크게 문자열, 숫자, 날짜/시간의 세 가지 범주로 나눌 수 있습니다. 각 형식의 저장 용량과 특성을 정확히 이해해야 테이블을 효율적으로 설계하고 불필요한 저장 공간 낭비를 막을 수 있습니다. 아래에서 SQL Server(Transact-SQL)의 대표적인 데이터 형식을 범주별로 살펴보겠습니다.
SQL Server의 문자열 데이터 형식
아래는 SQL Server(Transact-SQL)에서 제공하는 문자열 계열 데이터 형식입니다. 영문·숫자만 저장할지, 한글과 같은 유니코드 문자도 저장할지에 따라 적합한 형식이 달라집니다.
| 데이터 형식 구문 | 최대 크기 | 설명 |
|---|---|---|
| CHAR(n) | 최대 8,000자 | 고정 길이 문자열입니다. n은 저장할 문자 수를 의미하며, 입력된 문자가 n보다 짧으면 오른쪽에 공백이 채워집니다. 유니코드 문자는 지원하지 않습니다. |
| VARCHAR(n) 또는 VARCHAR(MAX) | 최대 8,000자 또는 2GB | 가변 길이 문자열입니다. n은 저장할 문자 수를 의미하고, MAX로 지정하면 최대 2GB까지 저장할 수 있습니다. 유니코드 문자는 지원하지 않습니다. |
| TEXT | 최대 2GB | 가변 길이 문자열입니다. 유니코드 문자는 지원하지 않습니다. |
| NCHAR(n) | 최대 4,000자 | 고정 길이 유니코드 문자열입니다. |
| NVARCHAR(n) 또는 NVARCHAR(MAX) | 최대 4,000자 또는 2GB | 가변 길이 유니코드 문자열입니다. n은 저장할 문자 수를 의미하고, MAX로 지정하면 최대 2GB까지 저장할 수 있습니다. |
| NTEXT | 최대 1,073,741,823바이트 | 가변 길이 유니코드 문자열입니다. |
| BINARY(n) | 최대 8,000바이트 | 고정 길이 이진(binary) 데이터입니다. n은 저장할 바이트 수를 의미하며, 부족한 만큼 공백으로 채워집니다. |
| VARBINARY(n) 또는 VARBINARY(MAX) | 최대 8,000바이트 또는 2GB | 가변 길이 이진 데이터입니다. MAX로 지정하면 최대 2GB까지 저장할 수 있습니다. |
| IMAGE | 최대 2GB | 가변 길이 이진 데이터입니다. |
참고: TEXT, NTEXT, IMAGE 형식은 Microsoft에서 더 이상 권장하지 않는(deprecated) 형식입니다. 새 프로젝트에서는 각각 VARCHAR(MAX), NVARCHAR(MAX), VARBINARY(MAX)를 사용하는 것이 좋습니다. 또한 한글 데이터를 저장할 계획이라면 반드시 NCHAR나 NVARCHAR처럼 유니코드를 지원하는 형식을 선택해야 합니다.
SQL Server의 숫자 데이터 형식
아래는 SQL Server(Transact-SQL)에서 제공하는 숫자 계열 데이터 형식입니다. 정수, 소수, 통화 값 등 용도에 맞는 형식을 선택하는 것이 중요합니다.
| 데이터 형식 구문 | 저장 범위 및 설명 |
|---|---|
| BIT | 정수 0, 1 또는 NULL을 저장합니다. |
| TINYINT | 0부터 255까지의 정수를 저장합니다. |
| SMALLINT | -32,768부터 32,767까지의 정수를 저장합니다. |
| INT | -2,147,483,648부터 2,147,483,647까지의 정수를 저장합니다. |
| BIGINT | -9,223,372,036,854,775,808부터 9,223,372,036,854,775,807까지의 정수를 저장합니다. |
| DECIMAL(m, d) | m은 전체 자릿수, d는 소수점 이하 자릿수를 의미합니다. 지정하지 않으면 m의 기본값은 18, d의 기본값은 0입니다. |
| DEC(m, d) | DECIMAL 데이터 형식과 동의어(synonym) 관계입니다. |
| NUMERIC(m, d) | DECIMAL 데이터 형식과 동의어(synonym) 관계입니다. |
| FLOAT(n) | n은 가수부에 저장되는 비트 수를 의미하며, 지정하지 않으면 기본값은 53입니다. |
| REAL | FLOAT(24)와 동일하게 동작합니다. |
| SMALLMONEY | -214,748.3648부터 214,748.3647까지의 통화 값을 저장합니다. |
| MONEY | -922,337,203,685,477.5808부터 922,337,203,685,477.5807까지의 통화 값을 저장합니다. |
SQL Server의 날짜/시간 데이터 형식
아래는 SQL Server(Transact-SQL)에서 제공하는 날짜/시간 계열 데이터 형식입니다.
| 데이터 형식 구문 | 저장 범위 및 표시 형식 |
|---|---|
| DATE | '0001-01-01'부터 '9999-12-31'까지의 날짜 값을 저장하며, 'YYYY-MM-DD' 형식으로 표시됩니다. |
| DATETIME | 날짜는 '1753-01-01'부터 '9999-12-31'까지, 시간은 '00:00:00'부터 '23:59:59.997'까지 저장합니다. 'YYYY-MM-DD hh:mm:ss[.mmm]' 형식으로 표시됩니다. |
| DATETIME2 | 소수 단위 초까지 정확하게 저장할 수 있습니다. 날짜는 '0001-01-01'부터 '9999-12-31'까지, 시간은 '00:00:00'부터 '23:59:59.9999999'까지 저장합니다. |
| SMALLDATETIME | 날짜는 '1900-01-01'부터 '2079-06-06'까지, 시간은 '00:00:00'부터 '23:59:59'까지 분 단위 정확도로 저장합니다. |
| TIME | '00:00:00.0000000'부터 '23:59:59.9999999'까지의 시간 값을 저장합니다. |
| DATETIMEOFFSET | 소수 단위 초까지 정확한 시간과 함께 시간대(time zone) 정보를 저장합니다. 시간은 '00:00:00'부터 '23:59:59.9999999'까지, 시간대 오프셋은 -14:00부터 +14:00까지 지원하며, 'YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm]' 형식으로 표시됩니다. |
참고: SQL Server 2008부터 도입된 DATETIME2는 기존 DATETIME보다 날짜 범위가 넓고 시간 정확도가 높기 때문에, 새로운 개발 환경에서는 DATETIME2 사용이 권장됩니다.