Database/Mysql

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

noahkim_ 2023. 11. 26. 01:49

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

 

1. 저장공간

CHAR

  • 선언한 길이만큼 고정된 크기로 저장됨
  • 부족한 공간은 공백으로 채움
  • 검색 속도가 빠름 (오버헤드 없음)

 

VARCHAR

  • 입력한 데이터 크기 만큼만 저장됨

 

길이 접두사
  • 데이터별 길이 접두사가 추가됩니다.
  • 255 바이트 이하: 1바이트
  • 256 바이트 이상: 2바이트

 

저장공간
  • 최대 64KB를 저장할 수 있습니다. (길이 접두사 포함)
  • 전체 row에 크기 제한이 있습니다.
    • 다른 컬럼에서 40KB 이상 사용하고 있다면 나머지 컬럼에선 24KB만 사용할 수 있습니다.
    • 24KB를 초과할 경우 TEXT 혹은 BLOB 타입으로 변환됩니다.

 

2. 대용량 문자열

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

 

TEXT

문자열
  • 문자 집합과 콜레이션 적용 가능
  • row 블록 별도에 둠 (수정 시에 row 데이터 변화 가능성 X)

 

인덱스 컬럼 제한 (InnoDB)
  • utf8bm4: 최대 768 글자까지
  • latin1: 최대 3072 글자 까지

 

BLOB

이진 데이터
  • 파일, 이미지 용
  • i/o가 일어남
  • 문자 집합과 콜레이션 적용 불가능
타입 필요 저장 공간
(L = 저장하고자 하는 데이터의 바이트 수)
TINYTEXT, TINYBLOB L + 1byte
TEXT, BLOB L + 2byte
MEDIUMTEXT, MEDIUMBLOB L + 3byte
LONGTEXT, LONGBLOB L + 4byte

 

포맷

REDUNDANT
  • 최대 768 바이트까지는 B-Tree 인덱스에 저장
  • 초과하는 부분은 외부 영역에 저장합니다. (Off-Page)

 

COMPACT
  • 기본적으로 사용되는 포맷
  • 최대 768 바이트까지는 B-Tree 인덱스에 저장하고, 초과하는 부분은 Off-Page에 저장합니다.
  • 데이터 압축
    • 공간을 20% 정도 줄여줍니다.
    • 레코드 하나의 최대 길이: 8KB (데이터 페이지 크기의 절반)

 

DYNAMIC
  • Compact의 개선된 버전 (처리 규칙 추가)
  • 외부 페이지에 저장하여 메인 데이터 페이지의 공간을 절약합니다.

 

COMPRESSED
  • DYNAMIC에 추가적인 압축 기능 적용
  • 저장 공간 절약 효과가 큼
  • CPU 오버헤드 발생

 

시스템 변수

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

 

3. 문자 집합

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

 

utf8mb4

크기
  • ASCII(영어권): 1바이트
  • 아시아권 언어: 3바이트
  • UTF-8 (emoji): 4바이트

 

특징
  • 다국어 문자를 포함할 수 있는 칼럼에 적합합니다.
  • 메모리에 기록될 경우 문자열 길이에 관계없이 문자당 4바이트로 할당됩니다.

 

UTF-8

  • utf8mb4의 서브셋
  • 한글자당 1~3바이트까지 사용합니다.
  • 이모지는 사용 불가합니다.

 

EUC-KR

  • 한국어 전용으로 사용되는 문자 집합 (완성형 한글만 지원)
  • 모든 문자는 1~2바이트를 사용합니다.

 

MS949

  • EUR-KR보다 조금 더 확장된 문자 집합
  • 윈도우에서 기본적으로 사용되는 한글 문자 인코딩
  • CP-949와 똑같은 문자 집합 (유닉스 운영체제에서 사용)

 

시스템 변수

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

 

4. 콜레이션

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

 

특징

문자 집합으로부터 독립적
  • 모든 문자열 타입의 칼럼 독립적인 문자 집합과 콜레이션을 가집니다.

 

다중 콜레이션 지원
  • 문자 집합은 2개 이상의 콜레이션을 가지고 있습니다.
  • 특정 문자 집합에 속한 콜레이션은 다른 문자 집합에서 사용할 수 없습니다.

 

디폴트 콜레이션
  • 문자 집합은 자신의 디폴트 콜레이션을 가지고 있습니다.
  • 콜레이션을 명시적으로 지정하지 않았다면, 비교 및 정렬시에 디폴트 콜레이션을 사용합니다.

 

문자 집합의 묵시적 결정
  • 콜레이션만 지정하면 콜레이션에 속한 문자 집합이 묵시적으로 해당 컬럼의 문자 집합이 됩니다.

 

타입 일치 결정
  • 타입의 이름과 길이 뿐만 아니라 콜레이션까지 일치해야 같은 타입입니다.
  • 콜레이션이 다르다면 인덱스 사용에서 추가적인 비교 연산이 수행됨

 

구성

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

 

Online DDL

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

 

설정

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