1. 숫자 데이터 형식
숫자형 데이터 형식은 정수, 실수 등의 숫자를 표현한다.
데이터 형식 | 바이트 수 | 숫자 범위 | 설명 |
BIT | 1 | 0 또는 1 또는 NULL | Boolean 형인 참(True,1) , 거짓(False,0) 에 사용 |
TINYINT | 1 | 0~255 | 양의 정수 |
SMALLINT | 2 | -32,768~32,767 | 정수 |
INT | 4 | 약 -21억~ + 21억 | 정수 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 정수 |
DECIMAL(p,s) | 5~17 | -10^38 ~ + 10^38-1 | 고정 정밀도(p)와 배율(s)을 가진 숫자형, 예) decimal(5,2)는 전체 자릿수를 5자리로 하되, 그 중 소수점 이하를 2자리로 하겠다는 의미 |
NUMERIC | 5~17 | -10^38 ~ + 10^38-1 | DECIMAL과 같은 데이터 형식 |
FLOAT(p) | 4~8 | ㅤ | p가 25 미만이면 4바이트, 25 이상이면 8 바이트 크기를 할당 |
REAL | 4 | ㅤ | FLOAT(24) 와 같음 |
MONEY | 8 | -2^63 ~ +2^63-1 | 화폐 단위로 사용 |
SMALLMONEY | 4 | 약 -21억 ~ + 21억 | 화폐 단위로 사용 |
DECIMAL, NUMERIC, MONEY, SMALLMONEY 데이터 형식은 정확한 수치를 저장하게 되고, FLOAT, REAL 은 근사치의 숫자를 저장한다. 대신 FLOAT와 REAL 은 상당히 큰 숫자를 저장할 수 있는 장점이 있다.
그러므로 소숫점을 저장하려면 DECIMAL 을 사용하는 것이 바람직하다.
2. 문자 데이터 형식
데이터 형식 | 바이트 수 | 설명 |
CHAR(n) | 0~8,000 | 고정길이 문자형, Character의 약자 |
NCHAR(n) | 0~8,000 | 글자로는 0~4,000자, 유니코드 고정길이 문자형, National Character의 약자 |
VARCHAR(n) | 0~2^31-1 | 가변길이 문자형, n을 사용하면 1~8,000까지 크기를 지정할 수 있고, max로 지정하면 최대 2GB 크기를 지정할 수 있음. Variable Character의 약자 |
NVARCHAR | 0~2^31-1 | 유니코드 가변길이 문자형. n을 사용하면 1~4,000까지 크기를 지정할 수 있고, max로 지정하면 최대 2GB 크기를 지정할 수 있다. National Variable Character 의 약자 |
BINARY(n) | 0~8,000 | 고정길이의 이진 데이터 |
VARBINARY(n) | 0~2^31-1 | 가변길이의 이진 데이터 값. n을 사 용하면 1~8,000까지 크기를 지정할 수 있고, max로 지정하면 최대 2GB 크기를 지정할 수 있음. 이미지, 동영상 등을 저장하기 위해 사용. Variable Bianary의 약자 |
CHAR 형식은 고정길이 문자형으로 자릿수가 고정되어 있다. 예를 들어, CHAR(100)에 ‘ABC’ 3바이트만 저장해도 100 바이트를 모두 확보한 후 앞에 3바이트를 사용하고 97 바이트는 낭비하게 된다.
VARCHAR 형식은 가변길이 문자형으로 VARCHAR(100) 에 ‘ABC’ 3바이트를 저장할 경우 3바이트만 사용하게 된다. 그래서 공간을 효율적으로 사용할 수 있다.
하지만 대용량 데이터베이스를 사용할 때 4글자 미만을 저장하게 될경우에는 CHAR형식으로 설정하는 것이 INSERT/UPDATE 할 때 더 좋은 성능을 발휘한다.
또 한글(유니코드)를 저장하려면 CHAR나 VARCHAR 형식일 때 2배의 자릿수를 준비해야 한다. 이는 한글이 2바이트의 자리를 차지하기 때문이다.
이때 NCHAR이나 NVARCHAR 형식을 사용하면 한글 분만 아니라 다른 나라의 언어까지 문제를 해 결할 수 있다. NCHAR(3)으로 지정하면 한글, 중국어, 일본어, 영어 등 모든 언어를 무조건 3글자로 저장할 수 있어 더 명확하게 문자 데이터를 입력할 수 있다.
하지만 영어만 저장할 것이 확실하다면 CHAR나 VARCHAR가 더 공간을 적게 차지해 성능 향상에 도움이 된다.
3. 날짜와 시간 데이터 형식
데이터 형식 | 바이트 수 | 설명 |
DATETIME | 8 | 날짜는 1751-1-1 ~ 9999-12-31 까지 저장되며, 시간은 00:00:00 ~ 23:59:59,997 까지 저장됨. 정확도는 밀리초(1/1000초) 단위까지 인식함. 형식은 “YYYY-MM-DD 시:분:초0” 사용됨 |
DATETIME2 | 6~8 | 날짜는 0001-1-1 ~ 9999-12-31 까지 저장. 시간은 00:00:00 ~ 23:59:59. 9999999 까지 저장됨. 정확도는 100나노초 단위까지 인식함. 형식은 “YYYY-MM-DD 시:분:초” 사용됨. DATETIME의 확장 |
DATE | 3 | 날짜는 0001-1-1 ~ 9999-12-31 까지 저장. 날짜 형식만 사용됨. “YYYY-MM-DD” 형식으로 사용됨 |
TIME | 5 | 00:00:00.0000000 ~ 23:59:59.9999999 까지 저장. 정확도는 100나노 초 단 |
DATETIMEOFFSET | 10 | DATETIME2와 비슷하지만 표준 시간대를 인식하여 24시간제를 기준으로 하는 시간도 표시해 줌. 형식은 “YYYY-MM-DD 시:분:초 + 표준시간” 형식으로 사용됨 |
SMALLDATETIME | 4 | 날짜는 1900-1-1 ~ 2079-6-6 까지 저장. 정확도는 분 단위까지 인식됨. |
조회 예를 통해 차이를 확인해보자.
SELECT CAST('2014-10-19 12:35:29.123' AS datetime) AS 'datetime' SELECT CAST('2014-10-19 12:35:29.1234567 +12:35' AS datetime2(7)) AS 'datetime2' SELECT CAST('2014-10-19 12:35:29. 1234567 +12:35' AS date) AS 'date' SELECT CAST('2014-10-19 12:35:29. 1234567 +12:35' AS time(7)) AS 'time' SELECT CAST('2014-10-19 12:35:29. 1234567 +12:35' AS datetimeoffset(7)) AS 'datetimeoffset' SELECT CAST('2014-10-19 12:35:29.123' AS smalldatetime) AS 'smalldatetime'
4. 기타 데이터 형식
데이터 형식 | 바이트 수 | 설명 |
ROWVERSION | 8 | VARBINARY(8)과 같으며, 데이터베이스 내에서 자동으로 생성된 고유 이진 숫자를 표시함. SQL Server 내부적으로 사용되는 것이라서 신경 쓸 필요는 없음. |
SYSNAME | 128 | NVARCHAR(128)과 같으며, 데이터베이스 개체의 이름에 사용됨. SQL Server 내부적으로 사용됨. |
CURSOR | 1 | T-SQL 커서를 변수로 처리함. |
TABLE | N/A | 테이블 자체를 저장. 임시 테이블과 비슷한 기능 |
UNIQUEIDENTIFIER | 16 | 복제(Replication)에서 사용되는 자료형. 유일성을 보장하기 위한 GUID 값을 저장함 |
SQL_VARIANT | N/A | 다른 데이터 형식의 저장이 가능한 데이터형 |
HIERARCHYID | N/A | 계층 구조가 있는 테이블을 만들거나. 다른 위치에 있는 데이터의 계층 구조를 참조할 수 있음. |
XML | N/A | XML 데이터를 저장하기 위한 형식으로 최대 2GB 저장됨 |
GEOMETRY/GEOGRAPHY | N/A | 공간 데이터 형식으로 선, 점 및 다각형 같은 공간 데이터 개체를 저장하고 조작할 수 있음 |
5. 사용자 정의 데이터 형식
사용자 정의 데이터 형식(User-Defined Data Types : UDT) 은 기존의 데이터 형식에 별칭을 붙이는 것으로, 사용 편의성 때문에 주로 사용한다. 예를 들어, 이름을 저장하기 위한 데이터 형식이 NCHAR(10) 이라면, 편리하게 myTypeName 등으로 이름을 붙일 수 있다.
데이터베이스 > 원하는 데이터베이스 선택 > 프로그래밍 기능 > 유형 > 사용자 정의 데이터 형식에서
정의할 수 있다.
타입 이름과 데이터 형식을 지정하면 사용자 정의 데이터 형식을 사용할 수 있다.
6. VARCHAR(MAX) / NVARCHAR(MAX) / VARBINARY(MAX)
SQL Server 에서는 LOB(Large Object : 대량의 데이터) 를 저장하기 위해서 VARCHAR(MAX) / NVARCHAR(MAX) / VARBINARY(MAX) 데이터 형식을 지원한다. 지원되는 데이터 크기는 2^31-1 바이트로, 약 2GB 크기의 파일을 하나의 데이터로 저장할 수 있다.
예로 장편 소설과 같은 큰 텍스트 파일은 내용을 전부 NVARCHAR(MAX) 형식으로 지정된 하나의 컬럼에 넣을 수 있고, 동영상 파일과 같은 큰 바이너리 파일이라면, 내용 전부 VARBINARY(MAX) 형식으로 지정된 하나의 컬럼에 넣을 수 있다.
영화 테이블
영화ID | 영화제목 | 감독 | 주연배우 | 영화 대본NVARCHAR(MAX) | 영화 동영상VARBINARY(MAX) |
0001 | 쉰들러리스트 | 스티븐 스필버그 | 리암 니슨 | ##### | ##### |
0002 | 쇼생크탈출 | 프랭크 다라본트 | 팀 로빈스 | ##### | ##### |
0003 | 라스트모히칸 | 마이클 만 | 다니엘 데이 루이스 | ##### | ##### |
예시의 영화 테이블처럼 영화와 관련된 정보를 저장할 때 영화 대본과 영화 동영상의 타입을 각각 NVARCHAR(MAX) 와 VARBINARY(MAX) 로 저장하면 하나의 컬럼에 파일을 넣을 수 있다.
7. 유니코드 데이터
문자 데이터를 저장하고 관리할 경우, 각 국가별 코드 페이지가 달라서 서호 호환이 되지 않는 문제점이 있다. 즉 데이터베이스에서 한국어만 사용할 경우에는 문제가 없지만, 한국어/중국어/일본어를 동시에 사용하는 경우에는 코드 페이지가 서로 달라서 많은 문제점이 발생하게 된다.
이런 데이터 형식이 CHAR, VARCHAR이다.
만약 여러 언어를 처리해야 한다면 NCHAR, NVARCHAR 형식을 사용해야 한다. 여기서 N은 National의 약자로 유니코드를 의미한다. 이 데이터 형식을 사용하게 되면, 전 세계의 어느 언어를 저장하든지 서로 충돌하는 상황이 발생하지 않는 장점이 있다.
유니코드 데이터 형식인 NCHAR, NVARCHAR, NVARCHAR(MAX) 은 CHAR, VARCHAR, VARCHAR(MAX)와 같이 사용하면 되지만, 몇 가지 차이점이 있다.
- 유니코드 문자를 저장할 때는 내부적으로 더 넓은 공간이 필요하다. 즉 CHAR(4)는 4바이트지만 NCHAR(4)는 8바이트를 내부적으로 차지한다.
- NCHAR의 열의 최대 크기는 8,000이 아닌 그 절반인 4,000이다. 이유는 유니코드는 2바이트의 공간을 요구하기 때문이다.
- 유니코드의 상수를 지정하려면 N’문자열’ 과 같은 형식을 사용한다.
- 유니코드는 문자에만 관련된 이야기이며, 숫자/날짜 등에서는 신경 쓸 필요가 없다.
NCHAR 나 NVARCHAR 형식의 문자를 입력할 때 N’문자열’ 형식을 사용하는 것을 권장한다. N은 반드시 대문자를 입력해야 하며 , N 을 생략해도 한글 운영 체제에서 한글/영문만 입력하는데는 문제가 없다.
USE tempdb CREATE TABLE uniTest( korName NVARCHAR(10) ) GO INSERT INTO uniTest VALUES (N'손연재'); -- 권장 INSERT INTO uniTest VALUES ('손연재'); -- 생략 가능 INSERT INTO uniTest VALUES (n'손연재'); -- 오류 발
Share article