MySQL - VARCHAR의 특성 및 한글 저장

.


Background

  데이터베이스를 다룰 때 문자열 데이터 타입의 선택은 매우 중요하다. 특히 MySQL에서 VARCHAR와 CHAR의 차이점을 이해하는 것은 효율적인 데이터베이스 설계에 핵심적이다.
  최근 데이터베이스 마이그레이션을 진행하면서 column type에 대해 고찰할 시간을 가지게 되었는데, 이번 게시글에서는 VARCHAR의 특성에 대해 자세히 알아보고, 특히 한글 저장과 관련되어 알게된 사실을 공유하고자 한다.


Subject

VARCHAR vs CHAR

  먼저, VARCHAR와 CHAR의 주요 차이점을 살펴보자:

VARCHAR (가변 길이 문자열)

  • 실제 데이터 길이에 따라 저장 공간이 달라진다.
  • 최대 길이를 지정할 수 있다 (예: VARCHAR(50)).
  • 데이터 길이에 따라 필요한 만큼의 공간만 사용하여 효율적이다.
  • 검색과 정렬 속도가 CHAR보다 상대적으로 느릴 수 있다.

CHAR (고정 길이 문자열)

  • 항상 지정된 길이만큼의 저장 공간을 사용한다.
  • 고정 길이를 지정한다 (예: CHAR(10)).
  • 검색과 정렬이 상대적으로 빠르다.
  • 짧은 문자열의 경우에도 지정된 길이만큼 공간을 차지하여 낭비될 수 있다.

  일반적으로 가변 길이 데이터에는 VARCHAR를, 고정 길이 데이터에는 CHAR를 사용하는 것이 좋다.

VARCHAR와 한글 저장의 흥미로운 사실

  VARCHAR 타입에 대해 흔히 오해하는 부분이 있다. VARCHAR(20)과 같이 지정된 숫자가 바이트 수를 의미한다고 생각하는 경우가 많은데, 실제로는 그렇지 않다.

  이 블로그 포스팅에서 이에 대한 흥미로운 실험 결과를 확인할 수 있다. 포스트에 따르면, VARCHAR(10)으로 설정된 컬럼에 한글로 10글자까지 입력이 가능했다. 더욱 놀라운 것은, 이렇게 저장된 10글자의 한글이 실제로는 30바이트의 공간을 차지한다는 사실이다.

  이는 MySQL에서 VARCHAR 뒤의 숫자가 바이트 수가 아닌 문자 수를 나타낸다는 것을 의미한다. 즉, VARCHAR(20)은 최대 20개의 문자를 저장할 수 있다는 뜻이며, 이는 한글이든 영어든 상관없이 적용된다.

  하지만 모든 데이터베이스 시스템이 이런 방식으로 동작하는 것은 아닐 수 있다. 예를 들어, Oracle의 VARCHAR2는 바이트 단위로 계산되기 때문에, 사용하는 DB의 특성을 잘 이해하고 적용하는 것이 중요하다.


Summary

  VARCHAR의 이러한 특성을 이해하면 데이터베이스 설계 시 더 효율적인 설계를 할 수 있다. 특히 다국어 지원이 필요한 애플리케이션을 개발할 때 이러한 지식은 매우 유용할 것이다. 항상 사용하는 데이터베이스 시스템의 공식 문서를 참조하고, 필요하다면 직접 테스트해보는 것이 가장 확실할 것으로 보인다.


Reference