[MySQL] CHAR와 VARCHAR 차이점

김우진·2021년 11월 4일
0
post-thumbnail

강의를 따라서 실습을 하다보면 같은 문자열을 저장하는데 CHAR를 쓸 때가 있고, VARCHAR를 쓸 때가 있었다. 이 둘의 차이점에 대해서 궁금해져서 조사하였다. MySQL 이론 정리에도 정리해두었다.

CHAR와 VARCHAR 차이점

CHAR

  • 고정길이 문자열 타입
  • 최대 길이 255
  • 타입의 크기만큼 데이터가 들어오지 않은 경우 이후 공간을 스페이스로 채움(mysql8.0(정확히 몇 버전 부터인지는 모름)에서는 select 시 후행 공백을 지우고 가져옴)
  • 고정길이 문자열 타입이므로 헤더에 레코드의 길이에 대한 정보가 들어있지 않다.

VARCHAR

  • 가변길이 문자열 타입
  • 최대 길이 255 (5.0.3 이후 65,535까지 가능)
  • 타입의 크기만큼 데이터가 들어오지 않으면 그 크기에 맞춰 공간 할당
  • 헤더에 레코드의 길이 정보가 포함(255 미만인 경우 1byte, 255 이상인 경우 2byte)

실습

MySQL 8.0버전에서는 CHAR 라고 하더라도 후행 공백을 지우고 데이터를 가져온다. 이를 해결하려면 sql_mode에 "PAD_CHAR_TO_FULL_LENGTH" 설정을 주면 된다.

sql_mode 설정 전

select char_length(char_column), char_length(varchar_column) from testtbl;
select length(char_column), length(varchar_column) from testtbl;

sql_mode 설정 전 쿼리 결과

sql_mode 설정

select char_length(char_column), char_length(varchar_column) from testtbl;
select length(char_column), length(varchar_column) from testtbl;

sql_mode 설정 후 쿼리 결과

이와 같이 "sql_mode"를 설정해주면 CHAR Type인 경우 공백을 차지하는 것을 볼 수 있다.
또한, 여기서 length(varchar())값이 4가 나오는 이유는 length() 함수는 String의 byte 길이만 반환 하므로 헤더의 "data_len"의 1byte는 포함하지 않기 때문이다.

출처

  1. mysql document : The CHAR and VARCHAR Types

썸네일 출처

unsplash페이지의 Brett Jordan님

0개의 댓글