Database

[MySQL] CHAR, VARCHAR, TEXT

감자b 2024. 12. 28. 00:15
  • CHAR
    • 저장되는 문자의 길이에 관계없이 최대 설정된 크기만큼 항상 공간을 할당
    • 최대 255글자까지 저장
    • 보통 저장된 값의 길이를 별도로 관리하지 않지만, CharSet이 가변 길이 문자셋이라면 관리
  • VARCHAR
    • 저장되는 문자의 길이만큼 저장 공간을 할당
    • 최대 65,535 바이트
    • 저장된 문자열 값의 실제 바이트 수를 관리함
      • 255 이하는 1byte, 그 이상의 경우 2byte 사용해서 관리
    • 하나의 VARCHAR 컬럼이 너무 큰 길이를 사용하면, 다른 컬럼들이 사용할 수 있는 최대 공간의 크기가 영향을 받음
      • (MySQL 서버의 레코드 크기 제한은 65,535 바이트이므로)

CHAR(5), VARCHAR(5)에 각각 문자열 ABC를 저장하는 경우 ( ()들어가는 숫자는 바이트가 아닌 글자 수임 )

| A | B | C |   |   |  ← CHAR(5) 5바이트를 할당해두고 남으면 공백

| 3 | A | B | C |    ← VARCHAR(5) 실제 저장된 문자열 길이를 관리하기 위한 1바이트 + 문자의 길이 할당

 

즉 둘의 가장 큰 차이는 CHAR 타입은 미리 공간을 할당한다는 것

  1. 만약 저장되는 문자열의 최소~최대 폭이 큰 경우 → CHAR 타입은 공간의 낭비가 심함
  2. 만약 VARCHAR(5)에서 처음 ABC로 저장한 상태에서 ABCD로 record update를 하는 경우 → VARCHAR는 예약해둔 공간이 없기 때문에 빈 공간을 찾아 레코드를 옮겨 쓰는 복잡한 과정이 필요
    • 기존 데이터가 저장된 공간은 delete marking 된다.
    • 자주 변경되는 컬럼의 경우 CHAR 타입이 데이터 페이지 프레그멘테이션 작업을 최소화함

따라서 값의 가변 길이 범위 폭이 좁고 자주 변경된다면 CHAR 타입이 효율적


TEXT

VARCHAR 타입과 마찬가지로 최대 65,535 바이트 저장 가능

VARCHAR와는 다르게 다른 컬럼에 영향을 미치지 않음. (컬럼이 많다면 유용)

 

VARCHAR(5000) vs TEXT

VARCHAR의 경우 어떤 테이블에 저장된 데이터를 읽을 때 메모리 버퍼 공간을 미리 할당해두며 이를 재활용

TEXT는 필요할 때마다 메모리를 할당하고 해제

 

즉 컬럼 사용이 빈번하고 메모리 용량이 충분하다면 VARCHAR 타입이 유용

만약 테이블에 많은 컬럼이 존재하고 길이가 긴 컬럼들을 자주 추가하는 경우 Row 사이즈 제한에 도달할 수 있으므로 이 땐 TEXT가 유용

 

VARCHAR, TEXT의 사이즈가 크면 Off-Page 형태로 데이터가 저장될 수 있음

→ Off-Page에 저장된 컬럼을 조회하는 경우 성능 저하가 있을 수 있으므로 유의

 

일반적인 RDBMS에서, TEXT, CLOB, BLOB과 같은 대용량 데이터를 저장하는 컬럼 타입 LOB(Large Object) 타입이라고 함.

그리고 LOB 타입은 일반적으로 Off-Page라는 외부 공간에 저장한다. (MySQL의 경우 데이터가 큰 경우만 외부 공간에 저장)