🤔 VARCHAR 의문점
우리는 왜 코드를 작성할 때 그 컬럼 타입을 VARCHAR(16) 처럼 정확히 맞춰서 설정할까?
새로운 엔티티의 ENUM 타입을 만들던 중에 언제나 처럼 ENUM 타입중 가장 큰 값을 기준으로 설정을 했다.
@NotNull
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "VARCHAR(12)")
private BannerType bannerType;
그러던 중 의문이 하나 들었다
“그냥 VARCHAR를 높은 값으로 설정하면 추후 ENUM 타입이 추가되었을 때를 대비해 더 유연해지는거 아니야? 아니면 아예 TEXT말고 VARCARH(9999)를 써버리는건?”
해당 궁금증을 해결하기 위해 한번 찾아보게 되었다.
VARCHAR를 높게 설정하면 TEXT를 대체 할 수 있을까?
먼저 데이터 타입들이 메모리에 어떻게 저장되는지부터 알아야한다.
하나의 레코드에 저장될 수 있는 최대 바이트의 수는 65,535바이트이다.
그렇다면 VARCHAR로 레코드를 꽉 채우려면 몇 글자가 필요할까?

VARCHAR는 레코드 안의 메모리를 사용하기 때문에 최대 21845글자 까지 허용될 수 있다고 한다.
CREATE TABLE varchar_test (
id BIGINT NOT NULL,
name VARCHAR(5000),
phone_no VARCHAR(5000),
address VARCHAR(5000),
email VARCHAR(5000),
gcn VARCHAR(5000),
PRIMARY KEY(id)
);
만약에 해당 수치를 넘는 테이블을 만든다면 아래와 같은 에러가 뜬다
Error Code: 1118. Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
그렇다면 TEXT는?
TEXT는 레코드 외부에 저장되고, 레코드 내부에는 TEXT 데이터의 포인터, 즉 데이터의 주소만 저장된다
이로 인해 TEXT는 하나의 컬럼에 65,535바이트까지의 데이터를 저장할 수 있어 VARCHAR보다 훨씬 더 큰 용량의 텍스트를 다룰 수 있다.
데이터를 찾으려면 한 번 데이터 포인터로 찾아야하기 때문에 성능이 안 좋을 수 있다. 그렇기에 사용이 빈번한 컬럼이면 사용을 지양하는게 좋다.
[ 더 큰 용량의 데이터 타입 ]
MEDIUMTEXT: 최대 16MB(16,777,215바이트)까지 저장 가능LONGTEXT: 최대 4GB(4,294,967,295바이트)까지 저장 가능
요약
Varchar 타입을 사용하면 하나의 레코드에 65,535바이트를 저장할 수 있다면, TEXT 타입을 사용하면 하나의 속성에 65,535바이트를 저장할 수 있는 것이다.
그 외에도 인덱스 설정 방법이 약간 다르거나 하는 것들은 그냥 데이터 타입의 차이라고 봐서 안적었습니다
- TEXT 타입 (각각의 속성이 대략 20000자)

느낀점
재밌었습니다
참고
https://medium.com/daangn/varchar-vs-text-230a718a22a1
https://yozm.wishket.com/magazine/detail/2726/
'Database' 카테고리의 다른 글
| 데이터베이스 트랜잭션 격리수준(Isolation Level)와 문제점 예시 정리 (0) | 2025.01.09 |
|---|---|
| 슬로우 쿼리를 잡자! EXPLAIN, EXPLAIN ANALYZE (1) | 2024.11.13 |
| DBMS의 핵심? 옵티마이저 (1) | 2024.11.06 |
| SQLite 사용기 (0) | 2024.10.21 |