Database
[MySQL] 문자열 타입 비교 (CHAR vs VARCHAR)
hyunwoome
2022. 7. 17. 18:09
물리 모델링에서 타입을 선정할 때 주의사항
- 저장되는 값의 성격에 맞는 최적의 타입을 선정
- 가변 길의 칼럼은 최적의 길이를 지정
- 조인 조건으로 사용되는 칼럼은 똑같은 데이터 타입으로 선정
칼럼의 데이터 타입을 선정할 때 실제 저장되는 값의 특성을 고려하지 않고 가능한 최대 길이 값을 기준으로 칼럼의 길이를 선택하면 디스크의 공간은 물론 CPU의 자원도 함께 낭비됩니다. 당연히 SQL의 성능도 저하됩니다.
문자열 타입인 CHAR와 VARCHAR 비교
처음 데이터베이스를 사용할 때는 둘 중에서 뭘 선택해야 할지 고민하다가 결국 VARCHAR만 쭉 사용하는 경우가 많은데, DBMS가 CHAR와 VARCHAR타입을 구분해서 제공하는 것을 보면 그만큼 장단점을 가지고 있다는 것을 짐작할 수 있습니다.
저장 공간
두 타입의 공통점은 문자열을 저장할 수 있는 데이터 타입이며, CHAR는 고정 길이, VARCHAR는 가변 길이를 갖습니다.
- 고정 길이는 실제 입력되는 칼럼 값의 길이에 따라 사용하는 저장 공간의 크기가 변하지 않습니다. 이미 MySQL에서 해당 칼럼의 길이를 알고 있기 때문에 길이를 나타내는 추가적인 공간이 필요 없습니다.
- 가변 길이는 최대로 저장할 수 있는 값의 길이는 제한돼 있지만, 그 이하 크기의 값이 저장되면 그만큼 저장 공간을 줄여 최적화합니다. 그러나 고정 길이와 다르게 가변 길이는 매 칼럼마다 몇 개의 글자 수가 들어올지 모르기 때문에 저장된 값의 크기가 얼마인지를 별도로 저장해 둬야 하므로 1~2바이트의 저장 공간이 추가로 필요합니다.
예를 들어 한글의 한 글자를 저장하기 위해 CHAR(1)과 VARCHAR(1) 타입을 사용할 때 실제 저장되는 저장 공간의 크기를 살펴보겠습니다. 한글의 한 글자는 2바이트로 CHAR(1)에는 2바이트가 저장됩니다. 그러나 VARCHAR(1)에는 2바이트에 추가 해당 칼럼의 길이를 명시하기 위해 1바이트의 공간을 추가로 설정하여 실제로 총 3바이트가 저장됩니다.
해당 컬럼이 자주 변경되는지 확인
두 타입은 저장 공간 이외에 해당 칼럼의 값이 변경될 때 어떤 현상이 발생하느냐에도 차이가 존재합니다.
- CHAR타입을 사용한 칼럼은 이미 저장 공간을 마련해두고 있기 때문에 그냥 변경되는 칼럼의 값을 업데이트하면 됩니다.
- VARCHAR타입은 글자 수를 넉넉하게 잡아놓고 그 보다 적은 수의 글자를 삽입하게 되면 해당 글자 수의 맞게 최적화를 위한 저장 공간을 줄인다고 위에서 살펴보았습니다. 만약 현재 저장되어 있는 글자 수보다 더 많은 글자 수가 들어온다면 레코드 자체를 다른 공간으로 옮겨서 저장해야 합니다.
그래서 CHAR타입을 사용하면서 뒤에 남는 몇 바이트 공간 낭비보다 VARCHAR를 사용하면서 업데이트할 때 생기는 작업으로 인해 더 큰 공간과 자원을 낭비할 수 있습니다.
💡 CHAR나 VARCHAR 키워드 뒤에 인자로 전달하는 숫자 값은 그 칼럼의 바이트 크기가 아니라 저장할 수 있는 글자 수를 나타냅니다. 예를 들어 VARCHAR(10)이면, 영어일 경우 각 문자가 1바이트를 사용하므로 10바이트를 사용합니다. 한글일 경우 2바이트를 사용하므로 20바이트를 사용합니다. 그래서 키워드 뒤에 인자로 전달하는 숫자가 동일하더라도 저장되는 값이 무엇인지에 따라 실제로 저장되는 공간이 달라집니다.
결론
- 저장되는 문자열의 길이가 대게 비슷하고, 컬럼의 값이 자주 변경돼야 할 경우에는 CHAR 타입을 적극적으로 사용
- 들어오는 글자 수가 매우 가변적이라면 VARCHAR를 사용