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
반응형
'데이터베이스' 카테고리의 다른 글
MySQL DBA DDL 실무 장애 경험 - (NULL -> NOT NULL) (0) | 2023.08.02 |
---|---|
MySQL에서 DDL과 Metadata Lock, 장애와 자동화 (2) | 2023.06.21 |
[MySQL8.0] row constructor 여러 레코드를 서로 다른 값으로 업데이트하는 방법 (1) | 2022.12.23 |
SQL 성능튜닝 가즈아 (0) | 2022.10.24 |
InnoDB의 레코드락에 대한 궁금점 (1) | 2022.07.15 |