Database/Mysql

[Real MySQL] 15-1. 데이터 타입: 문자열

noahkim_ 2023. 11. 26. 01:49

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. 저장 공간

타입

항목 CHAR VARCHAR
저장 방식 고정 길이 가변 길이 (입력한 데이터 길이 + 길이 접두사 저장)
남는 공간 처리 부족한 공간은 공백으로 채움 남는 공간 없음
검색 속도 빠름 느림 (길이 접두사로 인한 오버헤드)
길이 접두사 없음 있음 (255B 이하: 1바이트, 256B 이상: 2바이트)
저장 공간 제한 최대 255자 row 최대 크기내에서 가능 (길이 접두사 포함)
전체 Row 크기 제한 상대적으로 영향 적음 다른 컬럼 사용량에 따라 제한됨 (여유 공간 내에서 사용 가능)

 

2. 대용량

  • 64KB 이상의 데이터를 저장할 때 사용
  • 가변 길이 타입
  • 별도의 공간에 저장됨

 

타입

항목 TEXT BLOB
데이터 용도 문자열 데이터 이진 데이터 (이미지, 파일 등)
문자 집합
Collation
저장 위치 Row 외부에 별도 저장 (포인터만 row에 존재) 동일
인덱스 길이 제한 (InnoDB) utf8mb4: 최대 768자
latin1: 최대 3072자
동일
입출력 성능 일반적인 문자열 처리 속도 느림 (파일 I/O 수준의 접근)

 

크기

타입 최대 크기 필요 저장 공간 (L = 데이터 크기)
TINYTEXT, TINYBLOB 255 바이트 L + 1바이트
TEXT, BLOB 65,535 바이트 (64KB) L + 2바이트
MEDIUMTEXT, MEDIUMBLOB 16,777,215 바이트 (16MB) L + 3바이트
LONGTEXT, LONGBLOB 4,294,967,295 바이트 (4GB) L + 4바이트

 

포맷

종류 기본 설명 인덱스 저장 방식 기타 특징
REDUNDANT MySQL 5.0 이전 포맷 최대 768바이트까지 B-Tree 인덱스에 저장
초과 시 Off-Page 부분 분리
오래된 버전 호환용
공간 효율 낮음
COMPACT MySQL 5.0 이후 기본 포맷 최대 768바이트까지 B-Tree 인덱스에 저장
초과 시 Off-Page 부분 분리
데이터 구조 최적화
(공간 약 20% 절약)
DYNAMIC COMPACT 개선형 최대 768바이트까지 B-Tree 인덱스에 저장
초과 시 Off-Page 전체 분리
메인 페이지 공간 절약
(대용량 문자열/LOB에 유리)
COMPRESSED DYNAMIC + 압축 기능 적용 저장 구조는 DYNAMIC과 동일 저장 공간 절약 극대화
(CPU 사용량 증가 가능성 있음)

 

시스템 변수

  • max_sort_length: 설정된 바이트까지만 정렬을 수행합니다.
  • max_allowed_packet: 서버로 전송하는데 제한되는 SQL 문장 크기
  • innodb_default_row_format: 대용량 문자열이 저장되는 포맷

 

3. Character Set

  • 문자를 숫자에 매핑하는 체계 
  • 데이터베이스에서 사용하는 인코딩 방식

 

타입

인코딩 방식 문자 크기 (바이트) 이모지 지원 주요 특징 및 용도
utf8mb4 영어: 1B
한중일 문자: 3B
이모지: 4B
- UTF-8의 확장형
- 다국어 + 이모지 포함 가능
- MySQL 권장 설정
UTF-8 문자당 1~3B - utf8mb4의 서브셋
- 이모지 미지원
- 대부분의 웹 환경 기본 인코딩
EUC-KR 문자당 1~2B - 한국어 완성형만 지원
- 레거시 시스템에서 사용됨
MS949 문자당 1~2B (EUC-KR보다 확장) - Windows 기본 한글 인코딩
- CP949와 동일

 

시스템 변수

  • character_set_server: 기본 문자 집합
  • character_set_database: 데이터베이스 기본 문자 집합
  • character_set_system: 객체의 식별자를 저장할 때 사용하는 문자 집합
  • character_set_filesystem 파일의 이름을 찾을 때 사용하는 문자 집합
  • character_set_connection: 커넥션에서 사용하는 문자 집합
  • character_set_client: 클라이언트가 보낸 문장을 인코딩하는 문자 집합 
  • character_set_results: 서버가 쿼리의 처리 결과를 클라이언트로 보낼 때 인코딩하는 문자 집합 

 

4. Collation

  • 문자열 비교 및 정렬 규칙
  • 같은 문자 집합이라도 콜레이션이 다르면 정렬 순서가 달라질 수 있음

 

특징

항목 설명
문자 집합 독립성
콜레이션은 문자 집합에 속하지만, 개념상 비교/정렬 규칙으로써 독립적 역할을 함
문자열 칼럼 설정
모든 문자열 타입의 컬럼은 자체적으로 문자 집합과 콜레이션을 가짐 (테이블/DB와 무관하게 개별 설정 가능)
다중 콜레이션 지원
하나의 문자 집합은 여러 개의 콜레이션을 가질 수 있음
콜레이션-문자 집합 연결
특정 문자 집합에 속한 콜레이션은 다른 문자 집합에서 사용할 수 없음
디폴트 콜레이션
문자 집합마다 기본 콜레이션이 있으며, 명시적으로 설정하지 않으면 이를 사용함
묵시적 문자 집합 결정
콜레이션만 지정해도, 그 콜레이션에 해당하는 문자 집합이 자동으로 컬럼에 적용됨
타입 일치 조건
데이터 타입 비교 시 이름, 길이, 콜레이션까지 일치해야 완전히 같은 타입으로 간주됨
인덱스 연산 영향
콜레이션이 다르면 인덱스 비교 시 내부적으로 추가 변환/비교 연산이 수행됨

 

구성

utf8mb4_unicode_ci;
  • 첫번째 파트: 문자 집합
  • 두번째 파트: 문자 집합의 하위 분류 or bin (이진 값으로 비교)
  • 세번째 파트: 대소문자 구분 여부 (ci, cs)

 

Online DDL

  • 데이터가 변경되는 도중에도 스키마 변경을 할 수 있도록 하는 기능입니다.
  • 64KB를 초과하는 크기 변경이 발생하면 COPY Migration을 해야합니다. (데이터 크기 저장 공간이 늘어나므로)
  • 비용이 많이 듭니다.

 

설정

  • 테이블의 컬럼이나 DB 수준에서 개별적으로 설정할 수 있다.
  • information_schema의 COLUMNS 뷰를 확인하여 컬럼의 콜레이션을 확인할 수 있다.