본문 바로가기
Database

MySql char varchar text 정리

by devLog by Ronnie's 2022. 10. 11.

개발을 하던 중 히스토리성 데이터를 디비에 저장해야 될 일이 있었는데 그 중에 파라미터에 관련된 데이터를 저장해야되는 필드가 있었다. 동적인 데이터이기 때문에 가변성 타입인 varchar 타입으로 한 후 길이를 설정하려고 하는데 이게 상황에 따라서 길수도 있고 짧을 수도 있어 고민에 빠졌다. 

 

정말 간단하게는 text 타입을 쓰게되면 이런 길이 고민은 필요 없어지지만 성능에 영향을 미치기에 최대한 신중히 고민 선택하기로 했다. 과정에서 알게된 내용을 정리한다.

 

 

MySql char varchar text 정리


먼저 각각의 대해서 기본개념에 대해서 정리한다.

 

char


  • 고정 길이이다.
  • 0~255까지 길이를 저장 가능하다.
  • 고정 길이 만큼 디스크 공간을 차지한다.
  • 저장 후 남은 공간을 채우기 위해 남은 공간의 공백이 뒤에 채워진다.
    • 채워진 공백은 해당 row를 가지고 올때 빼고 가져온다.
    • PAD_CHAR_TO_FULL_LENGTH 해당 설정에 따라 빼고 가지고 올지 말지 설정 가능하다.
  • index 가능하다
  • char(n)에서 n은 문자 수이며 최대 길이는 255이다.
  • 주민등록 번호나 핸드폰 번호와 같이 길이가 고정된 데이터에 적합하다.
  • 디폴트 값 null 가능

 

varchar 


  • 가변형 이다.
  •  저장된 문자열 만큼의 디스크 공간을 차지한다.
  • varchar(n)에서 n은 마찬가지로 문자 수를 의미하고 최대 공간은 65535 바이트이다.
  • 실제 범위는 65532 또는 65533 이다
    • 헤더가 1 또는 2 바이트를 차지하기 때문
    • utf-8 인코딩일때 최대 65532/3 -> 21844자를 저장한다.
  • MySql 5.0.3 이전 버전에서 n은 바이트 수를 나타내며 이후 버전에서는 문자 수를 나타낸다.
  • index 가능하다.
  • 디폴트 값 null 가능

text


  • varchar 보다 더 큰 값을 저장 가능하다. (위에서 말했듯이 가장 간단한 방법)
  • index가 불가능하며 디폴트 값도 가질 수 없다.
  • 최대 65535 자의 문자를 저장할 수 있다.

 

 

정리


당연히 검색 속도로 비교 시 char가 가장 빠르고,  그 다음으로는 varchar, text 순이다. 

조회를 많이 해야되는 데이터이면서 조회 대상도 많다고 쳤을 때 성능상 이슈를 생각 안할 수 없다. 그렇기 때문에 데이터의 길이가 예상이 되지 않는다고 무조건 text 타입으로 지정하는 것은 옳지 않다. 예상이 되는 않는 데이터의 내용에서는 뺄 내용은 없는지, 아니면 꼭 그 많은 데이터를 다 같이 저장해야되는지 등등 여러 고민을 해본 후에 타입을 생각해서 정하는 것이 좋다.

 

타입을 정한 뒤 시간이 흐른 후에 다시 타입을 바꾸기란 쉽지가 않다. 큰 서비스일수록 더 쉽지 않을 것이다. 그러니 각각의 데이터 타입의 특성을 파악하고 여러 케이스와 추후 유지보수 측면에서도 생각한 후에 타입을 정하길 추천한다.

댓글