DB/MySQL

[MySQL] VARCHAR vs TEXT

27200 2025. 10. 11. 11:20

해당 내용은 인프런 Real MySQL 시즌1 - PART 1 강의를 참고하여 작성한 것입니다.

공통점

  • 문자열 속성 값을 저장
  • 최대 65,535 Bytes까지 저장 가능

차이점

  • VARCHAR 타입 컬럼에는 지정된 글자 수만큼만 데이터 저장 가능
    • VARCHAR(10) → 10글자 이하만 저장 가능
  • TEXT 타입 컬럼은 인덱스 생성 시 반드시 Prefix 길이 지정 필요
    • CREATE INDEX ix_text_column on table(text_column(100));
    • 위와 같이 사용하면 앞의 100글자까지만 인덱스로 사용하겠다는 뜻
    • 지정하지 않으면 에러 발생
  • TEXT 타입 컬럼은 표현식으로만 디폴트 값 지정 가능
    • CREATE TABLE tb1 (col TEXT DEFAULT ‘abc’) → 에러 발생
    • CREATE TABLE tb1 (col TEXT DEFAULT (‘abc’)) → 생성 가능

세부 사항

일반적인 사용 형태

  • 길이가 짧으면 VARCHAR 타입, 길이가 길면 TEXT 타입

VARCHAR(5000) vs TEXT?

  • VARCHAR 타입은 메모리 버퍼 공간을 미리 할당해 두며 재활용 가능, TEXT 타입은 필요할 때마다 할당 & 해제
  • 컬럼 사용이 빈번하고 메모리 용량이 충분하다면 VARCHAR 타입 추천
  • VARCHAR(5000)과 같이 길이가 긴 컬럼들을 자주 추가하는 경우, Row 사이즈 제한(65,535 Bytes)에 도달할 수 있으므로 적절하게 TEXT 타입과 같이 사용하는 것을 권장

VARCHAR(30) vs VARCHAR(255)?

  • 실제 최대 사용하는 길이만큼 명시해야 메모리 사용 효율 증가
  • 디스크 공간 효율 차이도 미미하게 존재(1Byte vs 2Bytes)

VARCHAR & TEXT 주의사항

    • 저장되는 값의 사이즈가 크면 Off-Page 형태로 데이터가 저장될 수 있다.
      • MySQL의 InnoDB 스토리지 엔진은 하나의 레코드 크기가 데이터 페이지의 절반 크기보다 큰 경우에 레코드에서 외부로 저장할 가변 길이 컬럼을 선택하게 되고, 그렇게 선택된 컬럼은 별도 외부 페이지의 데이터가 저장된다.

      • 실제 다른 컬럼들이 모두 저장되어 있는 본래의 데이터 페이지에는 이 외부 페이지를 가리키는 20바이트 포인터 값만 저장된다.

    • 이 경우 쿼리에 따라 성능의 큰 차이가 발생할 수 있다.