Programming/Database

데이터 타입 CHAR, VARCHAR의 차이점, 무엇을 써야할까?

Jan92 2022. 6. 22. 00:25

CHAR, VARCHAR

대표적인 문자열 데이터 타입에는 CHAR, VARCHAR가 있습니다. 이 두 가지의 차이점은 무엇인지, 각각의 특징은 무엇인지에 대해서 살펴보겠습니다.

 

 

먼저 데이터 타입(DataType)에 대해서 알아보면,

컴퓨터 시스템과 프로그래밍 언어의 측면에서 보는 데이터 타입(자료형)은 실수, 소수, 정수, 문자열, 날짜 및 시간 타입 등, 여러 종류의 데이터를 식별하는 타입을 말하는데요.

자료형에 대해 가능한 값, 수행할 수 있는 명령어, 데이터의 형태 및 의미, 크기, 해당 자료형의 값이 저장되는 방식을 이야기합니다.

 

데이터베이스의 측면에서 보는 데이터 타입 역시 비슷한데요.

테이블을 정의할 때는 컬럼 별로 저장할 수 있는 타입까지 명시해야 하는데, 컬럼에 들어갈 수 있는 데이터 유형은 일반적으로 숫자형, 문자형, 날짜형, boolean 등으로 구분되며, 각각의 데이터베이스가 사용하는 자료형의 이름에는 차이가 있을 수 있습니다.

(Oracle의 경우 숫자형 데이터 타입은 number를 사용하고, MySQL은 int, double, long 등을 사용합니다.)

 

컬럼을 선언할 때는 해당 컬럼의 데이터 타입에 대한 크기(size)도 중요한 기능을 하는데, 선언한 유형이 아니거나 지정된 크기를 넘는 자료가 입력되면 데이터베이스는 에러를 발생시킵니다.

 

 

 

CHAR, VARCHAR의 차이점(고정과 가변)

***

MySQL 4.1 이후 버전부터는 CHAR(n), VARCHAR(n)에서 n은 바이트가 아니라 글자 수를 의미합니다. 또한 4글자 이하의 VARCHARCHAR로 자동으로 변환됩니다.

 

 

'CHAR'는 길이가 고정된 문자열 타입입니다.

지정된 크기만큼 데이터가 들어오지 않는 경우 남은 공간을 공백(trailing space)으로 채워 넣으며, 최대 길이는 255입니다.

예를 들어서 CHAR(5)로 정의된 컬럼에 'ab'라는 2자리 문자열을 넣게 되면 남은 3자리는 'ab   ' 다음과 같이 공백으로 채워집니다. 결국 데이터의 크기는 항상 처음 선언된 5byte가 소요됩니다.

 

CHAR의 경우 남는 공간이 공백으로 채워지기 때문에 데이터의 낭비가 발생할 수 있는데요. 따라서 반드시 길이가 고정된 데이터만 CHAR로 선언하는 것이 좋습니다.

 

 

'VARCHAR'는 가변의 문자열 타입입니다.

Variable Character Field라는 이름의 의미처럼 가변의 길이를 가진 문자열 타입인데요.

데이터를 삽입할 때 데이터 값 외에 삽입된 문자열의 길이를 함께 저장하는데, 255 글자 이하에는 1byte, 255 글자가 넘는 문자열의 경우 2byte의 추가 공간을 필요로 합니다.

(실질적인 데이터와 데이터에 대한 길이도 함께 저장되는 구조입니다.)

 

예를 들어서 VARCHAR(10)에 'varchar'라는 문자열을 삽입하면, 데이터에 대한 크기인 7byte에 데이터의 길이를 저장하기 위한 1byte가 더해져서 총 8byte가 소모됩니다.

VARCHAR의 저장할 수 있는 최대 길이는 65,535입니다.

 

VARCHARCHAR 타입과 비교했을 때, 데이터의 길이를 확인하는 연산을 추가로 거쳐야 하는데요.

때문에 아주 미세한 속도 차이가 발생할 수 있으나, 이 정도의 차이로 인한 성능 저하는 거의 느낄 수 없는 정도라고 합니다.

또한 VARCHAR의 경우 데이터를 수정할 때, 기존보다 큰 데이터를 저장하게 되면 새로운 저장 영역에 할당해야 하기 때문에 데이터 파편화가 발생할 수 있다고 합니다.

(이 부분을 보완하기 위해 분할된 블록을 정리하는 기능이 나왔다고 알고 있는데, 정확한 내용을 찾을 수 없어서, 찾게 되면 추후에 내용 보충하도록 하겠습니다.)

 

 

 

그렇다면 둘 중 무엇을 사용해야 할까?

(개인적인 의견임을 참고 부탁드립니다.)

 

무엇을 사용하느냐에 대한 정답은 없는 것 같습니다.

원칙대로라면 고정된 크기의 문자열에는 CHAR를 쓰는 것이 맞고, 변동될 수 있는 문자열에는 VARCHAR를 사용하는 것이 맞다는 의견도 있습니다.

하지만 전체적인 프로젝트 관리의 측면에서 보는 것과 프로젝트의 내용이 언제든지 바뀔 수 있다는 점을 고려한다면 성능 차이가 거의 없는 VARCHAR를 통해 관리의 편의성과 프로젝트의 유연성을 확보할 수 있다는 의견도 있는데요.

 

이처럼 CHAR, VARCHAR를 사용하는 것은 프로젝트를 관리하는 사람에 따라, 혹은 회사 스타일에 따라 다를 수 있기 때문에 차이점만 알고 있다면 상황에 맞게 사용하는 것이 가장 좋은 방법일 것 같습니다.

 

 

 

 

< 참고 자료 >

 

DB 컬럼(Column) 타입 차이 알아보기 : CHAR vs VARCHAR 비교 및 특징

Index

goodgid.github.io

 

OKKY | char대신 varchar를 쓰는이유??

안녕하세요. 이번에 입사하여 디비 관련하여 ERD를 보았는데요 한글자를 필요로 하는 컬럼만 제외하고는 모든 문자 속성이 varchar로 설정이 되어있드라구요. 제가 알기로는 varchar는 char과는 다르

okky.kr

 

 

MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types

11.3.2 The CHAR and VARCHAR Types The CHAR and VARCHAR types are similar, but differ in the way they are stored and retrieved. They also differ in maximum length and in whether trailing spaces are retained. The CHAR and VARCHAR types are declared with a l

dev.mysql.com