DB/MySQL

[SQL] CHAR, VARCHAR

baek-dev 2024. 12. 18. 18:42

텍스트 데이터를 저장하는 데 사용되는 문자열 데이터 타입

둘 다 문자 데이터를 저장하지만, 저장 방식성능 특성이 다르다

1. CHAR

1.1. 정의

  • 고정 길이(Fixed-length) 문자열 데이터 타입
  • 저장하려는 데이터의 길이가 지정한 길이보다 짧더라도 빈 공간을 공백 문자로 채움

1.2. 특징

  1. 고정된 크기 :
    • 데이터가 길이보다 짧으면 남은 공간을 공백으로 채워 저장
    • 예를 들어, CHAR(10)에 "cat"을 저장하면, 실제로는 "cat "로 저장됨
  2. 빠른 속도 :
    • 고정된 길이 때문에 읽기와 쓰기 성능이 빠름
    • 데이터를 처리할 때, 문자열 길이를 계산하지 않아도 됨
  3. 메모리 낭비 :
    • 데이터 길이가 자주 달라지는 경우, 빈 공간을 채우기 때문에 저장 공간이 낭비됨

1.3. 예제

 
CREATE TABLE example_char (
    id INT,
    code CHAR(5)
);

INSERT INTO example_char (id, code) VALUES (1, 'ABC');
-- 'ABC  '로 저장됨 (뒤에 공백 추가)

SELECT LENGTH(code) FROM example_char WHERE id = 1;
-- 결과: 5 (공백 포함)

2. VARCHAR

2.1. 정의

  • 가변 길이(Variable-length) 문자열 데이터 타입
  • 데이터의 실제 길이에 따라 저장하며, 길이 제한만 설정

2.2. 특징

  1. 가변된 크기 :
    • 데이터의 실제 길이만 저장하며, 필요하지 않은 공간을 낭비하지 않음
    • 예를 들어, VARCHAR(10)에 "cat"을 저장하면 "cat"만 저장되고 나머지 공간은 사용되지 않음
  2. 저장 공간 효율적 :
    • 데이터 길이가 고정되지 않아, 데이터베이스가 실제 데이터 길이를 별도로 관리
    • 저장 공간이 최적화됨
  3. 속도 약간 느림 :
    • 길이를 별도로 저장하고 계산해야 하기 때문에, CHAR에 비해 속도가 약간 느림

2.3. 예제

CREATE TABLE example_varchar (
    id INT,
    description VARCHAR(10)
);

INSERT INTO example_varchar (id, description) VALUES (1, 'cat');
-- 'cat'만 저장됨

SELECT LENGTH(description) FROM example_varchar WHERE id = 1;
-- 결과: 3 (공백 없음)

3. CHAR vs VARCHAR 비교

특성 CHAR VARCHAR
길이 고정 길이 (빈 공간을 공백으로 채움) 가변 길이 (데이터 길이에 따라 저장)
속도 더 빠름 (고정된 길이로 작업) 느림 (길이 계산 필요)
저장 공간 효율성 공간 낭비 가능 저장 공간을 효율적으로 사용
사용 사례 고정된 길이의 데이터 (우편번호, 코드 등) 길이가 다양한 데이터 (설명, 이름 등)
최대 길이 데이터베이스에 따라 다름 (일반적으로 255자) 데이터베이스에 따라 다름 (최대 65,535자)

4. 사용 시 고려 사항

4.1. CHAR을 사용하는 경우

  • 고정된 길이의 데이터를 저장해야 할 때 :
    • 예: 우편번호(Zip Code), 국가 코드(Country Code), 전화 지역 코드
  • 데이터 길이가 동일하여 일관된 성능과 공간 활용이 중요한 경우

4.2. VARCHAR을 사용하는 경우

데이터 길이가 다양하고, 공간 효율성이 중요한 경우

  • 예 : 사용자 이름, 설명, 이메일 주소
  • 공간 낭비를 피하면서 유연하게 데이터를 저장하고 관리해야 할 때

5. 데이터베이스 엔진별 동작 차이

 

  • MySQL :
    • `VARCHAR`는 최대 65,535자까지 저장 가능
    • `CHAR`은 고정 길이로 저장되며, 데이터베이스 성능 최적화에 사용
  • PostgreSQL :
    • `VARCHAR`와 TEXT의 차이가 크지 않음
    • `CHAR`은 가변 길이로 작동하지만 공백을 채움
  • Oracle :
    • `VARCHAR` 대신 `VARCHAR2` 사용 (추가 기능 지원)

 

6. 추가로 알아야 할 점

6.1. 길이 제한

 

  • `CHAR(n)`과 `VARCHAR(n)`의 `n`은 최대 길이를 의미한다
  • 예 : `VARCHAR(10)`은 최대 10자의 문자열만 저장 가능. 초과 시 에러 발생

6.2. CHAR의 공백 제거

  • `CHAR` 타입의 공백은 일반적으로 쿼리에서 자동으로 제거된다
SELECT 'ABC' = 'ABC    ';
-- 결과: TRUE (CHAR 타입의 공백 무시)

6.3. VARCHAR의 길이 초과 처리

  • `VARCHAR`에 데이터가 최대 길이를 초과하면 에러가 발생한다
INSERT INTO example_varchar (description) VALUES ('ThisIsTooLong');
-- 오류: 데이터가 최대 길이(10)를 초과했습니다.

 


정리

 

  • `CHAR`은 고정된 길이를 유지하며 빠르고 일관성 있는 성능을 제공한다. 고정 크기의 데이터를 저장할 때 적합
  • `VARCHAR`은 가변 길이를 지원하며 저장 공간을 효율적으로 사용한다. 길이가 가변적인 데이터를 저장할 때 적합

 

 

 

 

 

 

 

출처 : ChatGPT

'DB > MySQL' 카테고리의 다른 글

MySQL 리플리케이션  (0) 2025.04.05
[SQL] SQL Dialects (SQL 방언)  (0) 2025.02.21
[SQL] 트랜잭션  (0) 2024.12.17
[SQL] 연산자  (0) 2024.12.10
[SQL] sql 명령어  (0) 2024.12.03