[MySQL] CHAR VS VARCHAR

코린이·2025년 5월 24일

MySQL

목록 보기
12/23

✅ CHAR vs VARCHAR

▶︎ CHAR와 VARCHAR의 공통점

  • MySQL에서 CHAR와 VARCHAR는 모두 문자열 저장에 사용되는 데이터 타입이다.

  • 문자열 크기 저장시 바이트 단위가 아닌 문자의 길이를 명시하여 저장한다.

--MySQL
--최대 10글자 작성이 가능하기 때문에 10byte ~ 40byte 크기로 저장
--숫자, 영어 문자 1byte
--한글 3byte
--이모지 4byte
CHAR(10)      
VARCHAR(10)


--Oracle을 기준
--최대 10byte 사용 가능
CHAR(10)
VARCHAR2(10)

▶︎ CHAR와 VARCHAR의 차이점

CHAR는 고정타입이고, VARCHAR는 가변타입이다.

  • CHAR : 문자의 길이와 상관 없이 한 번 정의된 크기로 저장
    • 최대 255 글자까지 저장 가능하다.
    • CHAR타입 중에서 가변길이 문자 UTF-8MB4를 사용하는 경우 VARCHAR처럼 값의 길이를 관리한다.
  • VARCHAR : 문자의 길이 만큼만 저장, 단 설정된 크기를 초과할 순 없음
    • 최대 약 16,000 글자까지 저장 가능하다.
    • VARCHAR타입의 경우 가변길이 관리를 위해 length-bytes를 사용한다.
      • 0~255 bytes -> length-bytes : 1
      • 256~65535 bytes -> length-bytes : 2

Latin1 문자의 경우 (영어 / 숫자)

CHAR 타입은 정의된 문자 길이만큼 항상 고정된 크기로 데이터를 저장한다. 입력된 값이 짧을 경우, 남는 공간은 공백 문자로 채워진다.

VARCHAR 타입은 입력된 문자 길이만큼만 저장되며, 여분의 공간은 저장하지 않는다. 다만, 문자 길이를 저장하기 위한 추가 공간(length byte)을 별도로 사용한다.

UTF-8MB4 문자의 경우 (한글 등 문자)

일반적으로 CHAR 타입은 정의된 문자 길이만큼 한상 고정된 크기로 데이터를 저장하지만, UTF-8MB4 문자 타입의 경우 문자당 바이트 크기가 다르기 때문에 가변적으로 관리될 수 있다.

기본적으로 정의된 문자 크기 n만큼 데이터 공간을 예약하고, 문자 길이 저장용 바이트를 사용한다. 만약 데이터 예약 공간을 초과할 경우 미리 확보한 예약 공간 없이 데이터를 저장한다.

VARCHAR 타입은 Latin1 문자와 동일한 방식으로 데이터를 저장한다.

▶︎ CHAR와 VARCHAR의 사용

CHAR 타입은 값의 변경 범위 폭이 짧고, 자주 변경되는 경우에 사용하는게 좋다.

  • CHAR 타입의 경우 고정적으로 예약된 데이터 공간을 가지고 있으므로 데이터가 추가된다 하더라도 새로운 레코드 공간을 찾을 필요가 없다.(예약된 공간이 있다고 가정)

    즉, In-place 방식으로 처리

VARCHAR 타입은 값의 가변 길이 범위 폭이 비교적 넓으면서, 자주 변경되지 않는 경우에 사용하는것이 좋다.

  • VARCHAR의 경우 문자 크기가 증가하면 그 크기만큼 저장할 수 있는 예약 공간이 없기 때문에 새롭게 저장할 수 있는 공간을 찾아 레코드를 저장해야 한다. (변경된 문자의 크기가 동일하거나, 작은 경우 기존 공간에 In-place 할 수 있기 때문에 상관없음)

    만약 문자열 길이 변경이 자주 발생할 경우, 레코드가 페이지 내 여러 위치에 흩어져 저장되면서 단편화가 발생하고, 성능이 저하될 수 있다.

0개의 댓글