Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

18 SQL Server에서 다루는 자료형 정리 본문

MSSQL/SQL 시작하기

18 SQL Server에서 다루는 자료형 정리

빌드이너프 2024. 10. 6. 14:47

데이터 삽입을 하면서 삽입하려는 데이터의 자료형이 열에 지정한 자료형과 맞지 않으면 오류가 발생.

SQL Server는 숫자형, 문자형, 날짜형, 지리형, 공간형 등 다양한 자료형을 제공.

 

숫자형

숫자형은 정수, 실수 등의 숫자.

 

SQL Server가 제공하는 숫자형 정보

 

숫자형 데이터 사용 시 주의사항

형 변환(type casting)에 주의해야 한다.

 

암시적 형변환

직접 자료형을 변경하지 않아도 실행 환경에서 자동으로 자료형을 변경하는 것

ex) 10/3 -> 3이 반환되지만 10/3.0 -> 3.33333이 반환(암시적 형변환)

연산 대상의 자료형이 다를 경우 데이터 우선순위에 따라 시스템이 상위 자료형으로 변경하므로 오류나 성능에 문제가 발생하기 쉬운만큼 주의해야 한다.

 

명시적 형변환

사용자가 직접 자료형을 변경하는 것

CATST, CONVERT 등의 함수를 사용해 자료형을 변환하는 것

 

숫자형 데이터의 형변환: 정수, 실수

SELECT 10/3;

SELECT 10/3.0;


일치하지 않는 자료형은 SQL Server에서 호환할 수 있는 형식으로 암시적으로 변환되는데, 우선순위가 정의된 프로세스에 따라 수행된다.

우선순위가 낮은 자료형은 우선순위가 높은 자료형으로 변환된다.

 

자료형 우선순위

숫자형 데이터는 합, 평균, 나누기 등 다양한 집계 함수에서 자주 사용한다.


문자형

다양한 문자를 저장할 수 있는 자료형

'고정 길이'와 '가변 길이'로 구분할 수 있다.

 

고정 길이

실젯값을 입력하지 않아도 지정한 만큼의 저장공간 사용

 

가변 길이

실제 입력한 값의 크기만큼만 저장 공간 사용

 

유니코드

한글이나 특수 문자 등을 저장할 때 사용하며, 한 글자에 2바이트라서 자료형에서 지정한 데이터 크기의 50% 정도만 저장할 수 있다.

 

SQL Server가 제공하는 문자형 정보

 

'고정 길이 문자열'과 '가변 길이 문자열', '유니코드 고정 길이 문자열'과 '유니코드 가변 길이 문자열' 속성을 가진 테이블에 A라는 문자를 삽입한 뒤 실제로 사용하는 저장 공간의 크기를 확인하는 쿼리

CREATE TABLE char_table (
col_1 char(50),
col_2 varchar(50),
col_3 nchar(50),
col_4 nvarchar(50)
)
GO

INSERT INTO char_table VALUES ('A', 'A', N'A', N'A')
Go

SELECT
	col_1, LEN(col_1) AS char_length, DATALENGTH(col_1) AS data_length,
	col_2, LEN(col_2) AS char_length, DATALENGTH(col_2) AS data_length,
	col_3, LEN(col_3) AS char_length, DATALENGTH(col_3) AS data_length,
	col_4, LEN(col_4) AS char_length, DATALENGTH(col_4) AS data_length
FROM char_table;

LEN: 문자열 길이를 확인하는 함수

DATALENGTH: 문자열 크기를 확인하는 함수

결과를 보면 삽입된 글자의 길이는 모두 1이지만 실제 저장 공간에 사용한 데이터의 길이는 다르다

 

유니코드를 사용하지 않았을 때 글자가 깨지는 것을 확인하는 쿼리

use DoItSQL
GO

CREATE TABLE unicode_table(
col_1 varchar(50),
col_2 nvarchar(50)
)
GO

INSERT INTO unicode_table VALUES ('가', N'가')
GO
SELECT * FROM unicode_table;

DoItSQL 데이터베이스의 기본 데이터 정렬 속성은 영어이므로, 유니코드를 사용하지 않을 경우 화면의 글자가 ?로 깨져 보이는 것을 확인할 수 있다.

 

유니코드란

더보기

국자마다 고유의 언어와 문자가 있듯이, 문자 형식의 데이터를 저장하고 관리할 때 국가별 코드 페이지가 달라서 서로 호환하지 않는 문제가 있다.

한국어 데이터베이스에 한국어만 사용하고, 영어 데이터베이스에 영어만 사용할 경우에는 큰 문제가 발생하지 않지만, 하나의 데이터베이스에 영어, 한국어, 중국어 등 여러 나라의 언어를 함께 사용할 때는 코드에 따른 문자가 서로 달라 문제가 발생한다.

이러한 문제점을 해결하고자 유니코드 형식을 사용하는데 전 세계에서 사용되는 대부분의 문자에서 단일 인코딩하는 방법을 정의한다.

유니코드 문자열을 저장하려면 한 글자당 2바이트 공간이 필요하다. 그래서 CHAR(4)는 4바이트이지만 NCHAR(4)는 8바이트의 공간이 필요하다.

유니코드로 저장하려면 자료형도 유니코드 형태여야 하지만, 데이터를 입력할 때 유니코드라는 것을 알려주고 문자열 앞에 반드시 대문자 N을 사용한다.

유니코드는 문자에만 해당되므로 숫자나 날짜 등에는 해당되지 않는다.

 

유니코드 형식의 열과 그렇지 않은 열에 데이터 삽입

-- 테이블 생성
CREATE TABLE doit_unicode (
col_1 varchar(50),
col_2 nvarchar(50)
)

-- 데이터 입력
INSERT doit_unicode VALUES('ABC', 'ABC')
INSERT doit_unicode VALUES('가나다', '가나다')
INSERT doit_unicode VALUES('가나다', N'가나다')

-- 데이터 검색
SELECT * FROM doit_unicode
-- 테이블 삭제
DROP TABLE doit_unicode

유니코드 형식이 아닌 열에 한글을 입력했을 경우 글자가 깨진다

유니코드 형식의 열인데도 유니코드라는 것을 가리키는 대문자 N을 생략하면 한글이 깨지는 것을 알 수 있다.

유니코드 자료형의 경우에도 N을 지칭하지 않으면 일반 코드로 입력되는 것을 알 수 있다.


날짜형과 시간형

날짜와 시간 자료형에는 날짜 또는 시간만 저장하는 타입도 있고, 날짜와 시간을 함께 저장하는 타입도 있다

정확도에 다라 데이터 크기와 형식이 조금씩 다르다

 

SQL Server가 제공하는 날짜형/시간형 정보

 

날짜 형식의 테이블을 생성한 다음, 현재 시간을 각 열에 같게 입력해 데이터가 어떻게 저장되는지 확인

CREATE TABLE date_table(
JustDate date,
JustTime time,
JustDateTime datetime,
JustDateTime2 datetime2);

INSERT INTO date_table
VALUES (SYSDATETIME(), SYSDATETIME(), SYSDATETIME(), SYSDATETIME());

SELECT * FROm date_table;

정확도에 따라 초 단위에서 소수점 자릿수가 다른 것을 알 수 있다

 

 

문자 형 변환을 할 수 있는 데이터 유형을 나타낸 표

문자와 날짜 형식도 형 변환을 할 수 있다.

행의 각 자료형이 열의 자료형으로 변환할 수 있는지 나타낸다