Database/Mysql

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

noahkim_ 2023. 11. 26. 01:49

"Real MySQL" 책을 정리한 포스팅 입니다.

 

1. 저장공간

CHAR (고정 길이)

  • 선언한 길이만큼 크기가 정해집니다.
  • 입력한 데이터 이외의 남은 크기의 공간은 빈 공간으로 채워집니다.
  • 검색 속도가 빠릅니다.

 

VARCHAR (가변 길이)

  • 데이터가 정해진 크기보다 작은 값일 경우, 그만큼 저장공간에 할당됩니다.

 

길이 접두사
  • 255 바이트 이하: 1바이트
  • 256 바이트 이상: 2바이트

 

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

 

문자 집합 (캐릭터 셋)

  • 문자를 컴퓨터에서 처리하기 위해 숫자에 매핑하는 체계
  • 데이터베2이스에서 사용하는 특정한 인코딩 방식을 의미합니다.

 

utf8mb4
  • 한글자당 1~4바이트까지 사용합니다.
    • 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_system: 객체의 식별자를 저장할 때 사용하는 문자 집합
  • character_set_database: 데이터베이스 기본 문자 집합
  • character_set_filesystem: 파일의 이름을 찾을 때 사용하는 문자 집합
  • character_set_client: 클라이언트가 보낸 문장을 인코딩하는 문자 집합 
  • character_set_connection : 커넥션에서 사용하는 문자 집합 
  • character_set_results : 서버가 쿼리의 처리 결과를 클라이언트로 보낼 때 인코딩하는 문자 집합 

 

콜레이션

  • 문자열 컬럼의 값에 대한 비교나 정렬 순서를 위한 규칙을 의미한다.
  • 문자열 값들을 어떻게 비교하고 정렬할 지 결정합니다.

 

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

 

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

 

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

 

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

 

타입 일치 결정
  • 타입의 이름과 길이 뿐만 아니라 콜레이션까지 일치해야 같은 타입입니다.
  • 콜레이션이 다르다면 인덱스 사용에서 추가적인 비교연산이 들어가므로 효율적인 사용을 위해 확인해야 한다.

 

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

 

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

 

저장 공간과 스키마 변경

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

 

2. TEXT, BLOB

  • 대용량 문자열을 처리하는 타입입니다.
  • 길이가 예측할 수 없이 클 때(64KB 이상) 사용합니다.
  • 인덱스 컬럼으로 사용할 경우 3072바이트 까지 허용됩니다. (InnoDB)
    • TEXT (DYNAMIC or COMPRESSED)(utf8bm4): 최대 768 글자까지
    • TEXT (DYNAMIC or COMPRESSED)(latin1): 최대 3072 글자 까지
  • 길이에 따른 여러 하위 타입이 있습니다.

 

TEXT

  • 문자 데이터용
  • row 블록 별도에 둠 (수정 시에 row데이터 변화 가능성 X)

 

BLOB

  • 이진 데이터용
  • 별도의 문자집합이나 콜레이션을 가지지 않습니다.
  • io가 일어남. (이미지)
  필요저장공간
(L = 저장하고자 하는 데이터의 바이트 수)
TINYTEXT, TINYBLOB L+1byte
TEXT, BLOB L+2byte
MEDIUMTEXT, MEDIUMBLOB L+3byte
LONGTEXT, LONGBLOB L+4byte

 

 

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

 

포맷

REDUNDANT
  • 최대 768 바이트까지는 B-Tree 인덱스에 저장하고, 초과하는 부분은 Off-Page에 저장합니다.
  • 768 바이트보다 큰 고정길이 컬럼은 가변길이 컬럼으로 인코딩되어 Off-Page에 저장됩니다.

 

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

 

DYNAMIC
  • Compact에 효율적인 처리 규칙이 추가된 버전 입니다.
  • BLOB, TEXT 및 기타 가변 길이 필드를 더 효율적으로 처리합니다.
  • 외부 페이지에 저장하여 메인 데이터 페이지의 공간을 절약합니다.

 

COMPRESSED
  • DYNAMIC에 압축관련 규칙이 추가된 버전 입니다.
  • 추가적인 성능이 필요합니다.