MySQL VARCHAR과 TEXT의 차이점과 적용시기

2023. 2. 1. 20:03데이터베이스

각 타입의 특징

VARCHAR

  • 컬럼에 가변길이 문자열 타입을 지정
  • 1부터 65535의 값을 가질 수 있음 (바이트가 아닌 글자 수)
  • 길이를 표현하기 위한 공간복잡도 오버헤드가 있음
  • 255까지의 길이는 1byte, 256부터는 2byte 오버헤드 존재
  • CHAR의 경우는 고정길이 문자열 타입이지만 공간복잡도 오버헤드가 없음
  • 인덱스를 생성할 수 있음

TEXT

  • VARCHAR와 동일하게 컬럼에 가변길이 문자열 타입을 지정
  • 최대 65535글자의 글자를 적재할 수 있지만 크기를 미리 지정 불가
  • 길이를 표현하기 위해 무조건 2byte의 공간복잡도 존재
  • 인덱스를 제한적으로 생성 가능함. 부분 prefix 인덱스만 가능

의문: VARCHAR로도 65535의 길이를 모두 표현 가능한데 TEXT를 사용해야 하는 이유가 뭘까?

  • 한 테이블 내에 64KB를 꽉 채운 가변길이 속성이 이상 존재하는 경우, TEXT를 사용해야 함.
  • 모든 VARCHAR 타입은 한 레코드에서 65535 글자만 적재할 수 있기 때문(한 레코드 모든 글자의 합)
  • 표준은 아니고, MySQL InnoDB의 레코드 크기 제한사항임
  • TEXT 타입은 이런 제한이 없음.
  • TEXT 타입의 데이터는 다른 속성들과 별도로 다른 페이지에 저장되기 때문

지적받았던 상황:

@Entity
public class Item extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
.
.
.
    @Column(columnDefinition = "varchar(255)", nullable = false)
    private String name;

    @Column(columnDefinition = "varchar(1000)", nullable = false)
    private String description;
  • varchar(1000) 을 사용한 이유에 대해 질문받음
  • TEXT를 사용하는게 맞을 것 같다고 대답함
  • 그런데, TEXT를 사용하는 이유를 물어보는 질문은 대답하지 못함
  • varchar(65535)을 사용할 수도 있지만 name 속성이 가변 길이 공간을 침범하고 있어서 불가능할 수도 있음.
  • 따라서 TEXT가 적절하다고 볼 수 있음
  • description이 더 길어진다면 mediumtext도 고려해볼만 함.

참고: https://stackoverflow.com/questions/25300821/difference-between-varchar-and-text-in-mysql