[문과 코린이의 IT 기록장] MSSQL - SQL Server 데이터 형식 (SQL Server 데이터 형식, char vs varchar, nchar vs nvarchar, 정수 데이터 크기와 범위, Boolean, 날짜, 시간 데이터 형식)
[문과 코린이의 IT 기록장] MSSQL - SQL Server 데이터 형식 (SQL Server 데이터 형식, char vs varchar, nchar vs nvarchar, 정수 데이터 크기와 범위, Boolean, 날짜, 시간 데이터 형식)
< 참고 영상 강의 >
MSSQL Server 2016 기반의 데이터베이스 입문에서 활용까지 Part.1 - 인프런 | 강의 (inflearn.com)
2022.01.19 - [문과 코린이의, [SQL] 기록] - [문과 코린이의 IT 기록장] MSSQL - DB & Table 생성 (데이터베이스 만들기, 테이블 만들기)
1. SQL Server 데이터 형식
1) 숫자/수치 관련
- 정수 데이터 : bigint(8byte), int(4), smallint(2), tinyint(1)
* 1byte = 8bit = 2^8 = 256 => 0-255까지 표현 가능
- 실수 데이터 : float, real
2) 날짜와 시간 관련
- date, time, datetime, smalldatetime, datetime2, datetimeoffset
3) 문자열 관련
- 기본 문자열 : char, varchar, text
ex. char(10) : 영어 - 10자 입력 가능 / 한글 - 한 글자당 2byte로 차지 (5개 입력 가능)
- 유니코드 문자열 : nchar, nvarchar, ntext
ex. nchar(10) : 영어 - 10자 입력 가능 / 한글 - 10개 입력 가능
- 이진 문자열 : binary, varbinary, image
4) 실습
2. char vs varchar
ex. char(10) : 영어 - 10자 입력 가능 / 한글 - 한 글자당 2byte로 차지 (5개 입력 가능)
1) char(10)
- var(variable)가 없다는 것은 고정적인 것이라는 의미
- 10의 범위라면 입력되지 않고 남은 공간은 공백으로 처리된다.
* 즉 abc입력시, 남는 7공간은 공백으로 처리된다는 것
* 즉, 처음 선언된 범위 그대로 모두 사용된다. 따라서, 입력되는 값이 선언된 길이보다 작다면 공간낭비가 발생한다.
- 고정길이의 값이 입력되는 경우에만 char로 지정하는 것이 좋다.
ex. 사번, 주민번호 (O) / 이름, 주소 (X)
- 4글자 미만시에는, char로 설정하는 것이 속도면에서 유리하다.
2) varchar(n | max)
- var(variable)가변적인 길이 타입을 의미한다.
- 입력되는 값이 8000byte를 초과하는 경우, max사용이 가능하며, 최대 2GB까지 저장 가능하다.
- varchar(10)일 경우 abc를 입력한다면, 실제 입력된 길이 3byte만 공간을 차지하며 남은 7byte값은 반환하게 된다.
# char, varchar 모두 최대 크기는 8000byte이다. ex. char(8000)까지 가능하다는 것
< DBMS 데이터 형식 > - 데이터 형식은 DBMS마다 형식이 다르다. * 따라서, 해당 DBMS를 다루는 과정에서 별도로 공부해야 한다. * 어느 하나를 잘 공부해두면 다른 DBMS 공부가 쉽다. - 초보자는 기본적으로 주력으로 사용하게 될 DBMS에 맞춰 공부한 후, 다른 DBMS 데이터 형식도 살펴보도록 한다. |
3. nchar vs nvarchar
ex. nchar(10) : 영어 - 10자 입력 가능 / 한글 - 10개 입력 가능
1) nchar(n)
- 유니코드(Unicode) 문자열 데이터 타입
- char(n) 타입과의 차이는, n 길이가 1-4000 사이 값이다. (8000이 X)
- 한 문자가 2byte이므로, 실제 저장소 크기는 n의 2배이다.
2) nvarchar(n | max)
- n은 1-4000 사이 값이다.
- 실제 저장소 크기는 n의 2배이며, max는 2GB까지 가능.
4. 정수 데이터 크기와 범위
- 보통 우리가 DB관련 업무에서 가장 많이 접하게 된다.
- 실수 사용보다는 정수 사용을 많이한다.
: bigint(8), int(4), smallint(2), tinyint(1)
* 주의할 점은, 0과 음수 포함 범위를 고려해야 한다는 것이다.
* bigint, int, smallint는 음수포함.
* Most Significant Bit(MSB) : 최상위 비트는 부호비트 구분용 비트 (1이면 음수, 0이면 양수)
ex 1. smallint = 2^15 = 32768 => 따라서 -32768 ~ 0 && 0 ~ 32767 (16번째 bit는 부호구분용 비트)
ex 2. int = 2^31 => 따라서 -2^31 ~ (2^31)-1
5. Boolean
- Boolean 데이터 타입은, True / False 값을 가질 수 있다.
- DBMS별로 이 데이터 타입을 구현하는 것은 조금씩 다 다르며, 이를 지원하지 않는 DBMS도 존재한다.
- SQL Server는 이 데이터 타입을 지원하지 않는다.
- 그러나 bit라는 데이터 타입을 통해서, 0 / 1 / NULL의 값을 가질 수 있다.
6. 날짜, 시간 데이터 형식
- date
- datetime
- smalldatetime
- 초의 정밀도를 높여주기 위해 생긴 데이터타입
: datetime2
: datetimeoffset * 애플리케이션을 전 세계로 배포시 datetimeoffset을 사용하면 표준 시간대가 지원됨.
: time
< 시간대란? >
- 경도 0도에 있는 그리니치 천문대를 기준으로 한 시간 차이. (각 지역(나라)에 따른 시각의 차이)
- 즉, 지구 자전에 따른 각 지역 사이에 발생하는 시간 차이로 생기는, 낮과 밤의 차이를 인위적으로 조정하기 위해서 만든 것.
- 과거에는 세계시간의 표준을 영국의 그리니치 천문대(GMT)를 기준으로 했으며, 이후 협정 시간대(UTC)로 대체하게 되었다.
* 한국 기준으로는 UTC 시간에 +9를 해주면, 한국 환산 시간이 된다. ex. UTC = 3시, 한국 = 12시
1) date
DECLARE @aaa date; -- aaa 변수 선언
SET @aaa = GETDATE(); -- aaa 변수에 값(현재시각) 세팅
SELECT @aaa AS 'DATE'; -- aaa 변수의 값을 출력해라 (열 이름 : DATE)
- 기본 문자열 리터럴 형식 : YYYY-MM-DD * 리터럴(literal) : 문자 그대로의
- 길이 : 10자리 (정확도 : 1일)
- 범위 : 0000-01-01부터 9999-12-31까지
< 실습 >
2) Datetime
DECLARE @aaa datetime; -- aaa 변수 선언
SET @aaa = GETDATE(); -- aaa 변수에 값(현재시각) 세팅
SELECT @aaa AS 'DATETIME'; -- aaa 변수의 값을 출력해라 (열 이름 : DATETIME)
- 기본 문자열 리터럴 형식 : YYYY-MM-DD hh:mm:ss[.mmm]
- 길이 : 최소 19자리부터 최대 23자리까지 (정확도 : .000) * 초 이하는 생략이 가능하기 때문 (000으로 출력)
- 범위 : 1753-01-01부터 9999-12-31까지
3) Datetime 2
* 초의 정밀도가 더욱 높아짐
* 소수점 7자리까지 가능
DECLARE @aaa datetime2; -- aaa 변수 선언
SET @aaa = GETDATE(); -- aaa 변수에 값(현재시각) 세팅
SELECT @aaa AS 'DATETIME2'; -- aaa 변수의 값을 출력해라 (열 이름 : DATETIME2)
- 기본 문자열 리터럴 형식 : YYYY-MM-DD hh:mm:ss[.소수 자릿수 초]
- 길이 : 최소 19자리부터 최대 27자리까지 (정확도 : 100나노초(ns))
- 작은 수치를 표현하는데 사용되는 단위 a. 밀리 (1천분의 1) ex. 1초 -> 1,000 밀리초 b. 마이크로 (1백만분의 1) ex. 1초 -> 1,000,000 마이크로초 c. 나노 (10억분의 일) ex. 1초 -> 1,000,000,000 나노초 |
- 범위(날짜) : 0001-01-01부터 9999-12-31까지
- 범위(시간) : 00:00:00부터 23:59:59.9999999까지
* DATETIME2는 소수점 지정이 가능하지만, DATETIME은 소수점 지정이 불가능하다.
4) Time
* 이 또한 초의 정밀도를 높여주는 데이터 형식
- 기본값 : 00:00:00
- 기본 문자열 리터럴 형식 -> hh:mm:ss[.nnnnnnn]
- 범위 : 00:00:00.0000000 -> 23:59:59.9999999까지
- 길이 : 최소 8자리(hh:mm:ss) ~ 최대 16자리(hh:mm:ss.nnnnnnn)까지
5) SYSDATETIME / SYSDATETIMEOFFSET
- SYSDATETIME / SYSDATETIMEOFFSET
: SQL Server 2008버전부터 지원하기 시작한 타입들
: 기존 GETDATE함수보다 더 정밀하고 정교한 시간을 반환
- SYSDATETIMEOFFSET함수는 시간대 정보까지 포함해서 반환
ex. 2200-12-25 09:50:34.1234567 + 09:00
* SYSDATETIMEOFFSET은 형식을 datetimeoffset을 사용해야함. (시간대 정보까지 포함해서 가져오는 것)
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |