[MySQL]CHAR vs VARCHAR

Bik_Kyun·2022년 4월 2일
0
post-thumbnail

1. CHAR

  • CHAR는 고정사이즈이다.
  • 남는 공간은 공백으로 채우게 된다.
  • 공백 채움 비교

    CHAR(10)인데 'test'라는 문자열을 insert하면 남는 6byte는 공백으로 채워진다.
    따라서 처음 선언된 10byte가 사용되는 것이다.

  • 값을 받아 올 때는 이 공백이 자동으로 제거된다.
    (만약, 공백까지 읽고 싶다면 PAD_CHAR_TO_FULL_LENGTH 모드를 활성화 시키면 된다.)
  • if(저장할 데이터 길이 < 선언된 컬럼 길이):
    남는 공간은 공백으로 채워지므로 공간의 낭비가 발생한다.
    따라서 반드시 고정길이에 해당하는 데이터만 CHAR로 선언하는 것이 좋다.

2. VARCHAR

길이 정보

  • VARCHAR는 가변 길이이다.
  • 데이터 삽입 시 데이터값 이외에 삽입된 문자열의 길이를 저장하는데 255글자 이하에는 1바이트 그 이상은 2바이트의 추가 공간을 필요로 한다.(실질적인 데이터와 길이 정보도 같이 저장된다.)

    VARCHAR(10)에 'test'라는 4byte짜리 문자열을 삽입하면 4byte + 1byte(길이를 저장하기 위한 메모리) = 5byte가 소모된다.

  • 저장할 수 있는 길이는 0부터 65,535까지이다.

공백 정보

  • 기본적으로 VARCHAR 값은 저장 시 공백이 추가되지 않는다.
  • 공백에 대한 처리는 MySQL 버전에 따라 다르므로 확인해 볼 것.

데이터 파편화

  • 만약 저장된 값을 변경하려고 할 때, 변경할 값이 저장된 사이즈 보다 클 때 데이터 파편화가 발생한다.
  • Why? : 기존보다 큰 데이터를 저장하기 위해 새로운 저장 영역에 새로 할당해야 하므로
  • 그래서 파편화를 염두한다면 데이터 타입 중에 VARCHAR를 사용해선 안된다.
  • MySQL 파편화 막는 법 : ALTER TABLE {테이블 이름} ROW_FORMAT = FIXED;
    (CHAR 타입으로 동작하도록 강제 지정, 데이터 용량은 증가하나 파편화로 인한 성능 저하는 막을 수 있다.)

4글자 이하 자동 변환

  • 4글자 이하는 VARCHAR는 CHAR로 자동 변환된다.
  • 만약 테이블 안에 VARCHAR 같은 가변 길이 데이터가 하나라도 있으면 3자 이상의 CHAR 칼럼이 자동으로 VARCHAR로 바뀌게 된다.
  • 이렇게 작동 되는 이유는 성능과 속도 때문이다.
  • 무조건 VARCHAR 사용시 가변이기 때문에 내부에서 추가적인 Logic이 발생하므로 속도 저하가 발생할 수 있다.
profile
비진

0개의 댓글