mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/06/09 ~ 2023/06/13 #56

Open danbi5228 opened 1 year ago

danbi5228 commented 1 year ago

다음 스터디

2023-06-13 pm 9:00 화요일

정리 범위

  1. 15 ~ 15.1.1
  2. 15.1.2 ~ 15.1.3
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 장현
  2. 단비
mojh7 commented 1 year ago

15. 데이터 타입

칼럼의 데이터 타입과 길이 선정할 때 주의 사항

실제 저장되는 값의 특성을 고려하지 않고 가능한 최대 길이 값을 기준으로 칼럼의 길이를 선택하면

만약 칼럼의 타입이 잘 못 선정되거나 길이가 부족하면


15.1 문자열(CHAR와 VARCHAR)

문자열 칼럼은 CHARVARCHAR 타입 중 어떤 타입을 사용할지 결정해야 한다


1.5.1.1 저장 공간

CHARVARCHAR 공통점은 문자열을 저장할 수 있는 데이터 타입이고 가장 큰 차이는 고정 길이인지 가변 길이인지이다

CHAR - 고정 길이

VARCHAR - 가변 길이


CHAR(1) vs VARCHAR(1)

사용자는 문자 집합에 따라 실제 저장 공간을 1~4바이트 까지 사용한다

CHAR 타입에 저장될 때는 추가 공간이 더 필요하지 않지만

VARCHAR는 문자열의 길이를 관리하기 위한 1~2바이트의 공간을 추가로 사용한다


MySQL 에서는 하나의 레코드에서 TEXTBLOB 타입을 제외한 칼럼의 전체 크기가 64KB를 초과할 수 없다

만약 VARCHAR 타입의 칼럼 하나만 있다면?

하지만 다른 칼럼이 40KB를 사용하고 있다면?


문자열 타입에 대해 얘기할 때 1문자와 1바이트는 구분해서 사용

VARCHAR가 64KB 크기까지 저장할 수 있다고해서 65536개의 글자를 저장할 수 있는 것은 아니다


문자열 값의 길이가 고정이냐 가변이냐만으로 정하지 않고 다음과 같은 판단 기준을 적용한다

길이 말고도 값이 얼마나 자주 변경되느냐가 중요하다

CREATE TABLE tb_test (
    fd1 INT NOT NULL
    fd2 CHAR(10) NOT NULL
    fd3 DATETIME NOT NULL
);

다음 테이블에서 fd2가 ABCD인 값으로 데이터를 추가했다가 ABCDE로 변경해보면

CHAR(10) 타입에 경우

VARCHAR(10) 타입에 경우


주민등록번호처럼 항상 값의 길이가 고정일 때는 당연히 CHAR 타입 사용하고

값이 2~3바이트 차이가 나더라도 자주 변경될 수 있는 부서 번호나 게시물의 상태 값 등은 CHAR 타입을 사용하는 것이 좋다


CHARVARCHAR 타입 뒤에 지정하는 숫자는 칼럼의 바이트가 아니라 문자의 수를 의미한다

그래서 CHAR(10) 라고 정의해도 실제로 디스크나 메모리에 사용되는 공간이 각각 달라진다


MySQL 서버에서는 utf8utf8mb4 문자 집합이 별도로 존재

utf8

utf8mb4

UTF-8 인코딩에서 각 문자가 저장 공간에 따라 다음과 같이 구분됨

utf8은 3바이트까지만 저장을 지원하니 SMP와 SIP와 이후 플레인 문자는 저장할 수가 없었다

이 문제를 해결하기 위해 utf8mb 라는 새로운 문자 집합이 도입됐다

utf8mb4 문자 집합은 utf8 문자 집합의 수퍼 셋(상위 셋)이기 때문에 utf8 문자 집합을 사용하던 테이블을 utf8mb4 문자 집합으로 전환(Convert)하는 것은 아무런 문제가 안됨

utf8mb4가 만들어지면서 utf8mb3라는 문자 집합이 만들어 졌는데 MySQL 8.0 버전에서는 utf8 문자 집합은 utf8mb3을 가리키는 별칭으로 정의돼 있다

danbi5228 commented 1 year ago

15.1.2 저장 공간과 스키마 변경 (Online DDL)

15.1.3 문자집합(캐릭터 셋)

15.1.3.1 클라이언트로부터 쿼리를 요청했을 때의 문자 집합 변환

15.1.3.2 처리 결과를 클라이언트로 전송할 때의 문자 집합 변환