본문 바로가기

DBMS/SQL Server

[SQL Server] char vs varchar

 

사용되는 문자열 값이 길이가 일정한지 가변적인지에 따라 데이터형식을 알맞게 사용하여야 한다.

문자열의 길이가 일정하면 char 혹은 nchar를 사용하고 가변적이면 varchar 혹은 nvarchar를 사용한다.

항상 3자 혹은 4자의 문자열이 들어오면 일정한 것이고, 처음에는 1자가 들어오고 다음에는 100자가

들어온다면 가변적인 것이다.

주의할 것은 고정이라고 해서 항상 3자만 들어오는 것이 아니라, 그 길이가 일정한 범위 내에서 차이가

없다는 것을 의미하는 것이다.

 

 

 

char 혹은 nchar는 값의 길이가 고정되어 있다. 만일 고정된 길이보다 작은 문자열이 들어오면 강제로

''(공백문자)를 넣어서 문자열의 길이를 통일시킨다.

varchar 혹은 nvarchar는 길이가 정해져 있다 하더라도 실제 들어온 데이터의 길이만큼을 저장한다.

그러나 실제 들어온 데이터의 길이를 알 수 없으므로 데이터의 길이도 별도로 저장한다.

 

또 하나의 차이는 데이터의 길이를 선언할 때이다.

char(10)은 10자의 고정 길이 문자를 저장하고 varchar(10)은 10자 내의 가변 길이 문자를 저장한다.

둘 다 10자를 초과하는 문자열은 잘려서 저장된다. 'ABCDEFGHIJK'에서 'K'는 잘린다.

그러나 'ABC'를 저장할 때 char(10)에서는 'ABC■■■■■■■' (■는 공백문자)로 저장되지만

varchar(10)에서는 'ABC'로 저장된다.

따라서 char에서는 문자열의 길이를 주의하여 꼭 필요한 크기만큼만 선언해야 한다.

varchar의 경우에는 예상 가능한 최대 크기를 선택해도 아무런 문제가 없다.

꼭 그만큼만 데이터가 들어가기 때문이다.

 

일반적으로 char의 성능이 varchar 보다 좋다. 이는 가변 길이를 계산하지 않기 때문이다.

특히 데이터를 업데이트 할 때는 char의 성능이 훨씬 뛰어나다.

char(10)과 varchar(10)에 둘 다 2바이트의 값 'AA;가 저장되어 있는데, 이를 'AAAAAAAAAA'로

업데이트 하려고 할 때, char(10)의 경우에는 미리 공간이 확보되어 있기 때문에 해당 페이지에 값을

업데이트 할 수 있다.

하지만 varchar(10)의 경우에는 여기에 2바이트의 공간 밖에는 없으므로 별도의 페이지를 생성하고

나머지 8바이트를 다른 페이지에 적기 때문에, 이런 경우 이론적으로 char에 비해서 varchar는

두 배 느린 I/O 성능을 나타낼 수 있다.

 

다음의 그림은 char 형식과 varchar 형식으로 저장되는 값들을 보여주고 있다.

 

 

 

char 형식은 값을 쓸 때는 4바이트씩 쓰고, 읽어올 때는 4바이트씩 읽어온다.

varchar 형식은 가변적인 길이를 가지는 값들을 읽고 쓸 때에 아주 유리하게 되어있다.

varchar 컬럼에 값을 저장하면 값이 없는 빈 바이트를 남겨두지 않는다.

대신 해당 값의 길이가 얼마나 되는지를 저장하는 오프셋(offset)을 관리하고 값이 지정된 바이트 수

만큼씩 읽어 들인다.

 

데이터 형식을 지정할 때 값이 고정인지 가변적인지 파악하여 적절한 데이터 형식을 사용하자.

 

 

참고 : Deep Inside T-SQL 쿼리 테크닉