본문 바로가기

programming/자료집

MSSQL 헷갈리는 자료형 정리(char, varchar, nchar, nvarchar)

반응형

1. 개요

 

 MSSQL을 배우던 도중, 대용량 서비스에서 자료형이 미치는 영향을 보았다. 선배께서는 자료형의 고려없이 무조건 대용량의 자료형을 설정한 데이터베이스와, 자료형을 고려하여 효율적으로 설계한 데이터베이스의 차이를 보여주셨다.

 

 조금더 자세하게 말하자면, 만약 사람의 이름을 저장할 때, 데이터 형식을 nvarchar(255)로 설정한 데이터베이스와 nvarchar(15)으로 설정한 데이터베이스의 차이를 볼 수 있었다. 데이터가 조금 들어갔다면 차이가 없었겠지만, 선배는 실제 회사에서 사용하는 데이터베이스를 예로 보여주셨다. 즉 데이터가 대용량이라는 뜻이다. 데이터가 많아지면 많이질수록 전자와 후자의 경우는 차이가 많이 났다. 'SELECT * FROME [TABLE]'과 같이 단순하지만 많은 양의 데이터를 조회하는 쿼리문의 경우 전자는 우리 수업이 끝날때까지도 쿼리문 수행이 끝나지 않았다. 참고로 우리 수업은 두시간이었다.

 

 수업을 통해 느낀것은, 데이터베이스를 설계할 때 중요한 것은 효율이라는 것이다. 결국 가장 기본적인 것 즉, 자료형과 같은 지식이 잘 잡혀있어야 될 것 같다는 것을 알게 되었다. 따라서 이번에는 내가 가장 헷갈렸던 자료형을 정리하여 올려보고자 한다.

 

2. 본문

 

- 문자열 자료형

 

 문자열 자료형이란 말 그대로 문자열을 나타내는 자료형이다. 그리고 데이터베이스는 효율, 문자 표준과 같은 이유로 문자열을 나타내는 자료형을 분리해놓았다. 이번 포스팅에서는 대표적인 문자열 자료형인 char, varchar, nchar, nvarchar에 대해 알아볼 것이다.

 

참고: 해당 글은 MSSQL 자료형을 기준으로 작성되었습니다.

 

- 문자열의 분류

 

 난 항상 정리를 한 다음 이를 해석하는 것을 좋아한다. 따라서 다음 표를 먼저 보도록 하자.

 


  고정 가변
유니코드가 아니다
(영어)
char varchar
유니코드이다
(외국어)
nchar nvarchar

 위의 표를 말로 설명하자면 아래와 같다.


char: 유니코드가 아닌 고정길이의 문자열

  • 예시) char(100) 자료형에 'abc' 만을 저장해도 고정적으로 100byte를 모두 확보한다. 결과적으로 97byte는 사용하지 않는다.

varchar: 유니코드가 아닌 가변길이의 문자열

  • 예시) varchar(100) 자료형에 'abc' 만을 저장하면 3byte만을 확보한다.

nchar: 유니코드를 저장하는 고정길이의 문자열

  • 예시) 한글 3글자를 저장하고 싶을 때는 nchar(3) 처럼 간단하게 선언할 수 있다.

nvarchar: 유니코드를 저장하는 가변길이의 문자열

  • 예시) 한글 3글자를 저장하고 싶을 때는 nvarchar(3) 처럼 간단하게 선언할 수 있으며 가변길이의 자료형이다.

 내가 가장 헷갈렸던 부분은 유니코드였다. 조금 복잡한 내용이지만 가장 간단하게 풀어보겠다.

 

 한글과 같은 경우 크기가 영어와는 다르다. 3글자 즉 'ABC'는 3byte이다. 그러나 한글과 같은 외국는 아니다.(미국에서는 한국어가 외국어니 외국어라고 하겠다.) 한글과 같은 외국어는 영어보다 크기가 두배 더 크다. 다시말해 한국어로 세글자는 6byte라는 것이다. 확인을 위해 다음 예시를 실행해보자.

 

SELECT DATALENGTH('ABC') AS '영어', DATALENGTH('세글자') AS '외국어'

 

 결과는 다음과 같다.



 만약 우리가 한글과 같은 외국어를 char이나 varchar과 같이 쓰려면 항상 사용하려는 문자열의 크기를 계산해서 넣어줘야 할 것이다. 꽤나 번거로운일을 안 할 수 있도록 도와주는 것이 바로 nchar과 nvarchar이다.

 

 앞서 말했지만, 우리가 '세글자' 라는 한글 문자열을 저장해야할 경우char자료형을 사용한다면 char(6)과 같이 저장해야 하지만, nchar는 nchar(3) 처럼 우리가 사용할 자릿수 그대로 입력해도 되기에 훨씬 편리하다. 한글 뿐만이 아니라도 어떤 언어든 글자수로 계산할 수 있기에 개발자 입장에서 이보다 편한 자료형이 있을까 싶다.

 

- 효율성

 

 그렇다면 효율성을 생각해보아야 한다. 지금까지 말한 모든 것들이 결국 효율성을 위해 말한 것들이기 때문이다.

 

- char, varchar 과 nchar, nvarchar

 

 자 그럼 유니코드 자료형과 그렇지 않은 자료형에 대해 비교해보자. 앞서 말했듯이 모든 문자를 자릿수로 판별할 수 있기에 nchar과 nvarchar이 편리한 것은 저명하다. 그러나 nchar과 nvarchar이 가지는 단점은 바로 char과 varchar이 보다 공간을 더 크게 차지한다는 것이다. 물론 하나하나를 비교한다면 별로 차이가 없겠지만, 대용량의 데이터베이스가 될 수록 이 둘의 차이는 명확해질 것이다. 결과적으로 '영어만을 사용하는 상황이 확실하다면' 즉, '데이터베이스에 영어만 저장할 것이라면' char과 varchar을 사용하는 것이 더욱 효율적일 것이다.

 

- 고정데이터와 가변데이터

 

 이제 고정데이터와 가변데이터를 생각해보자. varchar() 같은 경우 100byte를 입력해도 입력되는 데이터의 크기가 3byte라면 결과적으로믄 3byte의 길이를 차지하기에 훨씬 효율적이다. 그러나 문서를 찾아보니, 그렇지 않은 경우도 있었다.

 

 주민등록번호를 생각해보자. 우리나라 사람들의 주민등록번호는 13자리다. 12자리도 없고, 14자리도 없다. 아무리 데이터가 살아있는 생물이라지만 이는 불변의 진리이다. 이렇게 데이터의 크기가 확정된 경우는 char과 같은 고정길이의 자료형을 사용하는 것이 좋다. varchar과 같은 경우는 아아아아아아아주 미세하게 추가적인 로직이 작동하기 때문이다.

 

- 결어

 

 오늘은 데이터베이스의 자료형에 대해 정리하고 공부해보았다. 앞으로 더 많은 자료들을 정리하여 올렸으면 좋겠다.

반응형

'programming > 자료집' 카테고리의 다른 글

MSSQL 설치와 네트워크 세팅  (0) 2021.09.03