포스팅은 Real MySQL 8.0 (2권) 책을 기반으로 작성되었습니다. 각 타입마다 다양한 주제를 다루지만 가장 기초가 되는 부분 위주로 정리하였습니다.
목차
1. 문자열(CHAR, VARCHAR)
2. 숫자
문자열(CHAR, VARCHAR)
저장 공간
CHAR, VARCHAR의 가장 큰 차이는 길이가 고정인지 가변인지이다.
CHAR 타입은 고정 길이이다. 고정 길이란 실제 입력되는 컬럼값의 길이에 따라 사용하는 저장 공간의 크기가 변하지 않는다. 그래서 실제 저장된 값의 유효 크기가 얼마인지 별도로 저장할 필요가 없다.
VARCHAR 타입은 가변 길이이다. 가변 길이는 최대로 저장할 수 있는 값의 길이는 제한되어 있지만 그 이하 크기의 값이 저장되면 그만큼 저장 공간이 줄어든다. 하지만 가변 길이는 실제 유효한 값의 크기가 얼마인지를 별도로 저장해야 해서 1~2바이트의 저장 공간이 추가로 필요하다.
예를 들어 하나의 글자를 저장하기 위해 CHAR(1), VARCHAR(1) 타입을 사용하면 VARCHAR의 경우 문자열 길이를 관리하기 위한 1바이트 공간을 추가로 사용한다. 참고로 VARCHAR 타입의 길이가 256바이트 이상이라면 2바이트를 사용한다. 문자열 길이를 관리하는 저장 공간은 최대 2바이트기 때문에 VARCHAR 타입은 65536 바이트 이상을 설정할 수 없다. (2바이트 = 16비트, 16비트에 표현할 수 있는 최대 값이 2에 16제곱인 65536임)
문자열 값의 길이가 항상 일정하다면 CHAR를 사용하고 가변적이라면 VARCHAR를 사용하는 것이 일반적이라고 한다. 기껏해야 1바이트만 더 사용할 뿐인데 CHAR, VARCHAR 타입에 대해 고민할 필요가 있냐고 묻는다. 실제 문자열 값의 타입을 결정할 때 중요한 판단 기준은 다음과 같다고 한다.
(1) 저장되는 문자열의 길이가 대개 비슷한가?
(2) 칼럼의 값이 자주 변경되는가?
책을 여기까지 읽었을 때는 VARCHAR 보다 CHAR를 사용하는게 좋아보인다는 느낌이 든다.
CHAR의 경우에는 지정한 크기를 넘어설 수 없다.
한편 VARCHAR는 가변길이기 때문에 크기 변경이 가능하다. 이때 지정한 크기보다 더 큰 길이의 값이 들어올 수도 있다. 이 경우 레코드 자체를 다른 공간으로 옮겨서(Row migration) 저장한다. 이 때 드는 비용이 CHAR 타입으로 인한 공간 낭비보다 더 큰 공간이나 자원을 낭비하게 만든다고 한다.
추가로 문자열 데이터 타입을 사용할 때 주의해야할 점은 CHAR, VARCHAR 뒤에 오는 인자이다.
예를 들어 CHAR(5), VARCHAR(255) 괄호 내에 들어가는 숫자는 바이트를 의미하는 것이 아니라 5글자, 255글자를 저장할 수 있다는 것을 의미한다. 그렇기 때문에 이 칼럼이 실제로 디스크를 사용하는 공간이 달라진다.
숫자
숫자를 저장하는 타입의 값의 정확도나 표기법에 따라 나눌 수 있습니다.
정확도 : 참값과 근삿값
(1) 참값은 소수점 이하 값의 유무와 관계없이 정확히 그 값을 그대로 유지하는 것을 의미한다. 참값을 관리하는 데이터 타입으로는 INTGEGER를 포함해 INT로 끝나는 타입과 DECIMAL이 있다.
(2) 근삿값은 흔히 부동 소수점이라고 불리는 값을 의미하며, 처음 칼럼에 저장한 값과 조회된 값이 정확하게 일치하지 않고 최대한 비슷한 값으로 관리하는 것을 의미한다. 근삿값을 관리하는 타입으로는 FLOAT와 DOUBLE이 있다.
표기법
가볍게만 짚고 넘어가겠습니다. DECIMA을 제외한 숫자 타입은 이진 표기법을 사용합니다.
정수
DECIMAL 타입을 제외하고 정수를 저장하는데 사용할 수 있는 데이터 타입은 TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 5개이다. 각각의 차이는 저장 가능한 숫자 값의 범위이다.
정수 타입에는 UNSIGNED라는 옵션이 있다. 이 옵션을 사용하지 않으면 SIGNED이 된다. SIGNED란 음수와 양수를 동시에 저장할 수 있음을 의미한다. 만약 UNSIGNED 옵션을 설정하면 0보다 큰 양의 정수만 저장할 수 있고 범위는 2배가 된다.
책에서는 만약 특정 정수 컬럼이 조인 대상이나 외래 키로 사용된다면 UNSIGNED 옵션을 일치시키라고 말하고 있다.
해당 옵션을 주려면 아래와 같이 SQL 명령을 내리면 된다.
CREATE TABLE {table_name} (
{column_name} {정수 type} UNSIGED
)
'Database' 카테고리의 다른 글
커넥션 풀과 DB에서 병목이 발생하는 이유 (0) | 2023.10.03 |
---|---|
Redis - 컬렉션 (1) set, hash, sorted set (0) | 2023.06.20 |
Real MySQL 8.0 - 실행 계획 type 속성 (0) | 2023.05.16 |
Real MySQL 8.0 - SELECT (3) LIMIT n (1) | 2023.05.14 |
Real MySQL 8.0 - SELECT (2) WHERE 절의 비교 조건 사용 시 주의사항 (1) | 2023.05.14 |