1강. CHAR vs VARCHAR
2. CHAR vs VARCHAR
2-1. 공통점
문자열 저장용 컬럼
최대 저장 가능 문자길이 명시(바이트 수 아님)
문자셋에 따라서 디스크 사용량이 다르다.
Latin-1 : 각 글자마다 1바이트를 사용하고, 표현할 수 있는 글자가 한정적이다.
UTF-8 : 1-4바이트까지 사용이 가능하기 때문에, 표현하는 글자에 따라서 저장되는 용량이 달라진다.
2-2. 차이점
char : 값 실제 크기와 상관 없이 고정된 크기를 저장
varchar : 실제 크기 만큼만 저장
최대 저장 길이 : char(255) vs varchar(16383) → 65535 바이트
저장된 길이 저장 바이트 : varchar 는 저장된 길이를 저장하는 바이트가 있으면 필요에 따라서 1-2 바이트를 사용한다.
가변길이 문자셋(UTF-8) 을 사용하는 경우, char 타입도 저장된 길이 저장 바이트를 사용한다!
2-3. 실제 저장 예시
Latin1
UTF-8
가변길이 문자셋에서는 char 은 길이 저장용 바이트를 사용한다.
char 타입은 고정길이만큼 저장하기 때문에, 빈 공간이 있을 때, 공백으로 남겨두고 저장하게 되는데, UTF-8 의 경우 가변길이 문자셋이기 때문에, 빈공간이 남아있지 않을 수 있다.
가변길이 문자셋(UTF-8) 을 사용하는 경우, char 타입도 저장된 길이 저장 바이트를 사용한다.
3. CHAR 타입의 공간 낭비
3-1. 일반적으로 알고 있는 구분 기준
고정된 길이의 값 저장은 char 타입, 그 외 경우 varchar 타입
3-2. CHAR 대신 VARCHAR 를 사용하면?
저장되는 문자열의 최소 최대 가변 폭이 큰 경우 → CHAR 타입의 공간 낭비가 심하다.
저장되는 문자열의 최소 최대 가변 폭이 작은 경우 → CHAR 타입의 공간 낭비가 있을 수 있지만, 영향이 미비하다.
저장되는 값의 길이 변동이 크지 않다면, 낭비는 크지 않다. → 하지만 VARCHAR 를 사용하는 것이 일반적으로 최적화를 한다고 볼 수 있다.
4. 컬럼 값의 길이 변경(UPDATE) 시 작동 방법
처음 insert 시 실제 사용 문자수 만큼만 저장된다.
이후 update 시 디스크 내 새롭게 빈 공간을 찾아 변경된 컬럼값을 포함한 레코드 전체를 다시 빈 공간으로 저장하게 되고, 이때, 수 많은 insert, update, delete 로 빈 공간이 없을 경우 pragmentation(조각화) 통해 공간을 확보하고, 다시 저장하게 된다. → 하지만, pragmentation 자체의 비용이 크기 때문에, 변경이 많다면 varchar 타입보다 char 타입의 사용이 권장될 수 있다. -> 위와 같이 char 타입의 공간 낭비보다 큰 이점이 있다면, char 타입 사용을 고려해보자
기존의 사용했던 공간은 delete marking 처리 한다.
5. 문자열 타입 선정의 기준
5-1. VARCHAR 보다 CHAR 를 선정해야 하는 경우
값의 가변 길이 범위 폭이 좁고
자주 변경되는 컬럼의 경우(특히 인덱스로 설정된 컬럼의 경우)
위의 경우 VARCHAR 를 사용하게 되면 다음과 같은 문제점이 있다.
데이터 페이지 내부의 조각화 현상
CHAR 타입보다 공간 효율이 떨어짐
결론적으로, CHAR 타입의 공간 낭비를 생각하더라도 사용해야할 이유는 분명하게 있다.
Last updated