테이블 - 데이터 형식 및 우선 순위. 선행 정렬
SQL Server에서는 많은 데이터 형식들을 제공하는데 적절한 데이터 형식을 선택하는 것은 충분한 공간을 확보하면서도 저장 공간을 낭비하는 것을 피할 수 있다.
1. 데이터 형식
SQL Server에서 각 열, 지역 변수, 식 및 매개 변수는 관련된 데이터 형식을 가진다. SQL Server는 SQL Server에서 사용할 수 있는 모든 데이터 형식을 정의하는 일련의 시스템 데이터 형식을 정의할 수 있다.
데이터 형식, 데이터 정렬, 전체 자릿수, 소수 자릿수 또는 길이가 다른 두 식이 연산자에 의해 결합된 경우 그 특징은 다음 규칙에 따라 결정 된다.
- 결합 결과의 데이터 형식은 입력 식의 데이터 형식에 데이터 형식 우선 순위 규칙을 적용하여 결정 된다.
- 결과 데이터 형식이 CHAR, VARCHAR, TEXT, NCHAR, NVARCHAR 또는 NTEXT인 경우 결과의 데이터 정렬은 데이터 정렬 우선 순위 규칙에 따라 결정 된다.
- 결과의 전체 자릿수, 소수 자릿수 및 길이는 입력 식의 전체 자릿수, 소수 자릿수, 길이에 따라 달라진다.
(MSDN 참고:
http://technet.microsoft.com/ko-kr/library/ms187752.aspx)
SQL Server에서 데이터 형식은 다음의 범주로 구성된다.
정확한 수치 | 유니코드 문자열 |
근사치 | 이진 문자열 |
날짜 및 시간 | 기타 데이터 형식 |
문자열 |
SQL Server에서 일부 데이터 형식은 저장 특징에 따라 다음 그룹에 속하도록 지정 된다.
큰 값 데이터 형식 : varchar(max), nvarchar(max) 및 varbinary(max)
큰 개체 데이터 형식 : text, ntext, image, varchar(max), nvarchar(max), varbinary(max) 및 xml
정확한 수치
데이터 형식 | 범위 (정수 데이터를 사용하는 숫자 데이터 형식) | 저장소 |
bigint | -2^63(-9,223,372,036,854,775,808) ~ 2^63-1(9,223,372,036,854,775,807) | 8바이트 |
int | -2^31(-2,147,483,648) ~ 2^31-1(2,147,483,647) | 4바이트 |
smallint | -2^15(-32,768) ~ 2^15-1(32,767) | 2바이트 |
tinyint | 0 ~ 255 | 1바이트 |
데이터 형식 | 범위 (전체 자릿수와 소수 자릿수가 고정된 숫자 데이터 형식) | 저장소 |
decimal[ (p[ ,s] )] numeric[ (p[ ,s] )] | 1 – 9자리 | 5바이트 |
10 – 19자리 | 9바이트 | |
20 – 28자리 | 13바이트 | |
29 - 38자리 | 17바이트 | |
bit | 1, 0, NULL | 1바이트 |
데이터 형식 | 범위 (통화 또는 통화 값을 나타내는 데이터 형식) | 저장소 |
Money | -922,337,203,685,477.5808 - 922,337,203,685,477.5807 | 8바이트 |
smallmoney | - 214,748.3648 - 214,748.3647 | 4바이트 |
함수는 매개 변수 식이 bigint 데이터 형식인 경우에만 bigint를 반환한다. SQL Server에서는 다른 정수 데이터 형식(tinyint, smallint, int)을 자동으로 bigint로 승격 시키지 않는다.
테이블에 8개 이하의 bit열이 있다면 열은 1바이트로 저장된다. 9 – 16개 bit의 열이 있을 경우 2바이트로 저장. 이런식으로 계속 진행 된다.
Money 및 smallmoney 데이터 형식은 1/10000까지의 정확도를 가진 통화 단위를 나타낸다.
근사치
데이터 형식 | 범위 | 저장소 |
float | - 1.79E+308에서 -2.23E-308, 0과 2.23E-308에서 1.79E+308 | 1-24 / 7자리 / 4바이트 |
real | - 3.40E+38에서 -1.18E - 38, 0과 1.18E-38에서 3.40E + 38 | 25-53 / 15자리 / 8바이트 |
날짜 및 시간
데이터 형식 | 범위 | 저장소 | ||
date | 0001-01-01 ~ 9999-12-31 / 10자리 / 정확도 1일. | 3바이트(고정) | ||
datetime | 1753-01-01 ~ 9999-12-31 / 19 ~ 23자리 /정확도 .000, .003또는 .007 초 단위 반올림 | 8바이트 | ||
Datetime2 | 0001-01-01 ~ 9999-12-31 / 19 ~ 27자리 / 정확도 100나노초 | 전체 자릿수 3미만 : 6바이트 3,4인 경우 : 7바이트 전체 자릿수 : 8바이트 | ||
datetimeoffset | 0001-01-01 ~ 9999-12-31 / 26 ~ 34자리 / 정확도 100나노초 | 10바이트 | ||
smalldatetime | 1900-01-01 ~ 2079-06-06 / 19자리 / 정확도 1분 | 4바이트(고정) | ||
time | 00:00:00.0000000 ~ 23:59:59.9999999 / 8 ~ 16 자리 / 정확도 100나노초 | 5바이트(고정) | ||
데이터 형식 | 출력 | |||
time | 12:35:29. 1234567 | |||
date | 2007-05-08 | |||
smalldatetime | 2007-05-08 12:35:00 | |||
datetime | 2007-05-08 12:35:29.123 | |||
datetime2 | 2007-05-08 12:35:29. 1234567 | |||
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |
문자열
데이터 형식 | 범위(고정 길이 또는 가변길이 문자 데이터 형식) | 저장소 |
char | 1 ~ 8000 / 8000바이트 초과시 max 사용 | n바이트 / max(2^31-1) |
Nchar(유니코드) | 1 ~ 4000 | N * 2 바이트 / max(2^31-1) |
varchar | 1 ~ 8000 / | n바이트 / max(2^31-1) |
Nvarchar(유니코드) | 1 ~ 4000 | n바이트 / max(2^31-1) |
text | 2^31 - 1(2,147,483,647) | 2,147,483,647 바이트 |
Ntext(유니코드) | 2^30 - 1(1,073,741,823) | 2,147,483,647 바이트 |
이진 문자열
데이터 형식 | 범위(고정 길이 또는 가변길이 문자 데이터 형식) | 저장소 |
binary | 1 ~ 8000 / 8000바이트 초과시 max 사용 | n바이트 / max(2^31-1) |
varbinary | 1 ~ 8000 / 8000바이트 초과시 max 사용 | n바이트 / max(2^31-1) |
image | 0 ~ 2^31-1(2,147,483,647) | 2,147,483,647 바이트 |
2. 데이터 형식 우선 순위
(MSDN 참고:
http://technet.microsoft.com/ko-kr/library/ms190309.aspx)
연산자로 데이터 형식이 다른 두 식을 결합할 경우 데이터 형식 우선 순위 규칙에 따라 우선 순위가 낮은 데이터 형식이 우선 순위가 높은 데이터 형식으로 변환된다. 이때 암시적 변환이 지원되지 않으면 오류가 반환 된다. 피연산자 식이 같은 데이터 형식일 경우에는 연산 결과도 같은 데이터 형식이 된다.
- 사용자 정의 데이터 형식(가장 높음)
- sql_variant
- xml
- datetimeoffset
- datetime2
- datetime
- smalldatetime
- date
- time
- float
- real
- decimal
- money
- smallmoney
- bigint
- int
- smallint
- tinyint
- bit
- ntext
- text
- image
- timestamp
- uniqueidentifier
- nvarchar(nvarchar(max) 포함)
- nchar
- varchar(varchar(max) 포함)
- char
- varbinary(varbinary(max) 포함)
- binary(가장 낮음)
3. 선행 정렬
(MSDN 참고:
http://technet.microsoft.com/ko-kr/library/ms179886.aspx)
데이터 정렬 선행 규칙은 char, varchar, text, nchar, nvarchar 및 ntext 문자열 데이터 형식에만 적용됩니다. 그 외 다른 데이터 형식의 개체는 데이터 정렬 평가에 적용되지 않습니다.
피연산자 강제 변환 수준 | 명시적 X | 암시적 X | 기본값 강제 변환 | 데이터 정렬 없음 |
명시적 Y | 오류 발생 | 결과는 명시적 Y | 결과는 명시적 Y | 결과는 명시적 Y |
암시적 Y | 결과는 명시적 X | 결과는 데이터 정렬 없음 | 결과는 암시적 Y | 결과는 데이터 정렬 없음 |
기본값 강제 변환 | 결과는 명시적 X | 결과는 암시적 X | 결과는 기본값 강제 변환 | 결과는 데이터 정렬 없음 |
데이터 정렬 없음 | 결과는 명시적 X | 결과는 데이터 정렬 없음 | 결과는 데이터 정렬 없음 | 결과는 데이터 정렬 없음 |
- 연산자와 함수는 데이터 정렬을 인식하거나 또는 인식하지 않는다.
- 비교 연산자와 MAX, MIN, BETWEEN, LIKE, IN 연산자는 데이터 정렬을 인식한다.
- CAST, CONVERT, COLLATE 함수는 char, varchar 및 text 데이터 형식에 대해 데이터 정렬을 인식한다.
- 문자열을 반환하지만 입력 문자열은 사용하지 않는 기본 제공 함수의 경우 결과 문자열은 기본값 강제 변환이 되며 현재 데이터베이스의 데이터 정렬 또는 함수를 참조하는 사용자 정의 함수, 저장 프로시저, 트리거를 포함하는 데이터베이스의 데이터 정렬이 할당된다.
이로써 SQL Server에서 사용하는 데이터 형식과 크기에 대해서 알아 보았는데 적절한 데이터 타입은 저장소의 효율성 뿐만 아니라 데이터의 처리에 있어서도 우월한 성능을 발휘 할 수 있다.
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server 2014 향상된 백업 및 복원 (0) | 2015.07.16 |
---|---|
11_SQL 2008 강좌 - (3) 테이블 삭제 및 수정 (0) | 2015.07.15 |
11_SQL 2008 강좌 - (1) 테이블 생성 (2) | 2015.07.15 |
10_SQL 2008 강좌 - (3) DB관리 - DB논리적 물리적 이름 파일경로 변경 및 파일 그룹 추가 삭제 (0) | 2015.07.15 |
10_SQL 2008 강좌 - (2) DB관리 - DB명 수정, 파일크기 수정 (0) | 2015.07.15 |