[mySQL] CHAR vs VARCHAR
by 코딩무비
우리는 문자열 컬럼을 사용할 때 char 타입과 varchar 타입 중 하나를 결정해야 한다. 일반적으로 VARCHAR을 사용하게 되는데 왜 CHAR타입을 사용하지 않고 VARCHAR타입을 사용하는지, CHAR타입을 사용했을 때의 장점은 무엇인지 알아가고자 이 글을 작성하게 되었다.
저장 공간
CHAR와 VARCHAR 타입 모두 문자열을 저장할 수 있는 데이터 타입이다.
그렇다면 CHAR와 VARCHAR타입의 주된 차이는 무엇일까??
정답은 고정 길이냐 가변 길이냐 이다.
- 고정 길이는 컬럼값의 길이에 상관없이 저장공간의 크기가 변하지 않는다. 실제 저장된 값의 크기가 얼마인지 별도로 저장할 필요가 없어 추가적인 공간이 필요하지 않다.
- 가변길이는 최대로 저장할 수 있는 값의 길이는 제한되어 있다. 그 이하의 값이 저장되면 그만큼 저장 공간의 크기는 줄어든다. VARCHAR 타입은 저장된 값의 유효 길이가 얼마인지 별도로 저장해둬야 하므로 1~2 바이트의 추가적인 저장공간이 더 필요하다.
- 타입의 길이가 255바이트 이하라면 1바이트, 255바이트 이상이면 2바이트이다.
- 256*256*= 65536 바이트 이상으로 최대 길이를 선택할 수 없음(추가적인 저장 공간은 2바이트까지이기 때문)
MySQL에서 하나의 레코드에서 TEXT, BLOB 타입을 제외한 컬럼의 전체 크기가 64KB을 초과할 수 없다.
만약 하나의 테이블에 A,B,C 컬럼을 사용한다고 했을 때, A,B,C 세개의 컬럼의 전체 크기가 64KB을 초과하면 안된다.
우리는 일반적으로 문자열 값의 길이가 일정하다면 CHAR을 사용하고 일정하지 않다면 VARCHAR을 사용하면 좋다고 배웠다.
왜 고정적이면 CHAR가 좋은 것일까????? 1~2 바이트의 저장공간을 더 사용하고 간편하게 VARCHAR타입을 사용하는 것이 낫지 않은가???
CHAR와 VARCHAR을 선택하는 주된 기준은 다음과 같다고 한다.
- 저장되는 문자열의 길이가 대개 비슷한가?
- 컬럼의 값이 자주 변경되는가?
CREATE CHAR_TABLE {
ID INT
NAME CHAR(10) -- 10의 의미는 문자의 개수이다.(바이트가 아님)
AGE INT
}
다음과 같이 테이블을 만들었다고 가정해보자.
char의 경우 물리적으로 하드디스크에 데이터 생성된 그림은 다음과 같을 것이다.
NAME 컬럼의 경우 10바이트을 사용하면서 CODING의 경우 4바이트의 공백 문자로 채워진 것을 확인할 수 있다.
VARCHAR 타입도 동일하게 테이블을 만들어보자.
CREATE VARCHAR_TABLE {
ID INT
NAME VARCHAR(10) -- 10의 의미는 문자의 개수이다.(바이트가 아님)
AGE INT
}
var
그렇다면 여기서 MOVIE의 데이터를 MOVIES로 변경한다면 어떻게 될까???(SQL 문은 생략)
CHAR 타입의 경우 공백 문자가 있기 때문에 변경되는 값(MOVIES)을 업데이트 해주면 된다.
VARCHAR 타입의 경우 문제가 있다. 현재 MOVIES에 해당하는 레코드의 NAME의 컬럼은 5바이트밖에 저장할 수 없는 구조로 되어 있다. 따라서, 더 큰 값으로 변경할 때에는 레코드 자체를 다른 레코드에 옮겨서 저장해야 한다.
Reference
- Real My SQL 8.0
블로그의 정보
코딩무비
코딩무비