Open danbi5228 opened 1 year ago
칼럼의 데이터 타입과 길이 선정할 때 주의 사항
실제 저장되는 값의 특성을 고려하지 않고 가능한 최대 길이 값을 기준으로 칼럼의 길이를 선택하면
만약 칼럼의 타입이 잘 못 선정되거나 길이가 부족하면
서비스 도중에 스키마 변경이 필요할 수 있다
스키마 변경 작업은 서비스 중지나 읽기 전용 모드로의 전환 작업이 필요할 수 있다
실제로 저장되는 값의 성격을 정확히 분석하고 최적의 타입과 길이를 선정하는 것이 중요하다
문자열 칼럼은 CHAR
와 VARCHAR
타입 중 어떤 타입을 사용할지 결정해야 한다
CHAR
와 VARCHAR
공통점은 문자열을 저장할 수 있는 데이터 타입이고 가장 큰 차이는 고정 길이인지 가변 길이인지이다
CHAR - 고정 길이
VARCHAR - 가변 길이
사용자는 문자 집합에 따라 실제 저장 공간을 1~4바이트 까지 사용한다
CHAR 타입에 저장될 때는 추가 공간이 더 필요하지 않지만
VARCHAR는 문자열의 길이를 관리하기 위한 1~2바이트의 공간을 추가로 사용한다
VARCHAR 타입의 길이가 255바이트 이하면 1바이트, 256~65535이하의 길이는 2바이트를 사용한다
VARCHAR 타입의 최대 길이는 2바이트로 표현할 수 있는 이상은 사용할 수 없다
MySQL 에서는 하나의 레코드에서 TEXT
와 BLOB
타입을 제외한 칼럼의 전체 크기가 64KB를 초과할 수 없다
만약 VARCHAR 타입의 칼럼 하나만 있다면?
하지만 다른 칼럼이 40KB를 사용하고 있다면?
VARCHAR 타입은 24KB만 사용할 수 있다
초과하는 VARCHAR 타입의 칼럼을 생성하려고 하면 에러가 발생하거나 자동으로 TEXT 타입으로 대체된다
칼럼을 새로 추가할 때 VARCHAR 타입이 TEXT 타입으로 자동 변환됐는지 확인해 보는 것이 좋다
문자열 타입에 대해 얘기할 때 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
타입을 사용하는 것이 좋다
CHAR
타입으로 인해 발생하는 2~3바이트 공간 낭비보다 더 큰 공간이나 자원을 낭비하게 된다CHAR
와 VARCHAR
타입 뒤에 지정하는 숫자는 칼럼의 바이트가 아니라 문자의 수를 의미한다
그래서 CHAR(10)
라고 정의해도 실제로 디스크나 메모리에 사용되는 공간이 각각 달라진다
MySQL 서버에서는 utf8
과 utf8mb4
문자 집합이 별도로 존재
utf8
utf8mb4
UTF-8 인코딩에서 각 문자가 저장 공간에 따라 다음과 같이 구분됨
utf8은 3바이트까지만 저장을 지원하니 SMP와 SIP와 이후 플레인 문자는 저장할 수가 없었다
이 문제를 해결하기 위해 utf8mb 라는 새로운 문자 집합이 도입됐다
utf8mb4 문자 집합은 utf8 문자 집합의 수퍼 셋(상위 셋)이기 때문에 utf8 문자 집합을 사용하던 테이블을 utf8mb4 문자 집합으로 전환(Convert)하는 것은 아무런 문제가 안됨
utf8mb4가 만들어지면서 utf8mb3라는 문자 집합이 만들어 졌는데 MySQL 8.0 버전에서는 utf8 문자 집합은 utf8mb3을 가리키는 별칭으로 정의돼 있다
ALGORITHM=INPLACE, LOCK=NONE
옵션으로 스키마 변경 가능ALGORITHM=COPY LOCK=SHARED
옵션으로 스키마 변경 가능SHOW CHARCTER SET
명령으로 확인 가능 (p.363 참고)
Default collation
칼럼에서 확인 가능utf8mb4
로 설정되어 있음character_set_client
시스템 변수에 지정된 문자 집합으로 인코딩돼 있다고 판단하고
받은 문자열 데이터를 character_set_connection
에 정의된 문자집합으로 변환character_set_results
변수에 설정된 문자 집합으로 변환해 클라이언트로 전송character_set_client
, character_set_results
, character_set_connection
3개는
클라이언트 프로그램이나 클라이언트의 GUI 도구에서 마음대로 변경할 수 있는, 세션 변수이면서 동적 변수
다음 스터디
2023-06-13 pm 9:00 화요일
정리 범위