MySQL 자료형 타입 종류 / 개념

방충림·2023년 4월 5일
5

Database

목록 보기
2/4
post-thumbnail

관계형 데이터베이스는 엑셀처럼 표, 테이블 구조로 된 데이터들을 대량으로 저장하고 관리, 사용하기 위해 만들어졌다.
데이터들이 다 DB서버의 공간을 계속 차지하기 때문에 저장공간을 최대한 효율적으로 활용하는게 정말 중요한 이슈다. 때문에 다양한 데이터 타입이 존재하고, 상황에 따라 적합한 타입을 골라 사용해야한다.

자료형의 유형은 크게 숫자, 문자열, 날짜, 기타 이 4가지로 나뉜다.

각각에 포함되는 자료형들과, 관련한 몇가지 개념을 알아보자.

숫자 데이터 형식

데이터 타입바이트 수숫자 범위설명
BIT(N)N/81 ~ 64bit를 표현합니다.b'0000' 과 같이 표현
TINYINT1-128 ~ 127정수
SMALLINT2-32,768 ~ 32,767정수
MEDIUMINT3-8,388,608 ~ 8,388,607정수
INT
INTEGER
4약 -21억 ~ +21억정수
BIGINT8약 -900경 ~ +900경정수
FLOAT4-3.40E+38 ~ -1.17E-38소수점 아래 7자리까지 표현
DOUBLE REAL81.22E-308 ~ 1.79E+308소수점 아래 15자리까지 표현
DECIMAL(m, [d])
NUMERIC(m, [d])
5 ~ 17-1038+1 ~ +1038-1전체 자릿수(m)와 소수점 이하 자릿수(d)를 가진 숫자형
예) decimal(5, 2)는 자릿수 5자리로 하되 소숫점 이하를 2자리로 합니다.
>> 673.21

DECIMAL은 정확한 수치를 저장하지만 FLOAT, REAL은 근사치 값을 저장한다.
대신에 FLOAT, REAL은 더 큰 숫자를 저장할 수 있다.


SIGNED vs UNSIGNED 정수형 예약어

정수형 자료형에만 사용할 수 있는 예약어 중에 SIGNEDUNSIGNED 라는 것이 있다.
양수만 사용될 것인지 음수도 사용될 것인지 여부에 따라 선택하며, 용량 절약에 큰 도움이 된다.

SIGNED

SIGNED는 양수와 음수 양쪽을 다 다룰 때 사용한다. 사용가능한 공간을 절반으로 나눠 양수, 절반은 음수에 사용한다.

UNSIGNED

UNSIGNED는 양수만 다룬다. 때문에 적절한 경우에 UNSIGNED를 사용하면 두배를 더 표시할 수 있다.


Fixed vs Floating 실수형

Fixed : 고정 소수점 자료형

고정 소수점 자료형에는 DecimalNumeric 이 있는데 이 둘은 이름만 다르다고 봐도 무방하다.
이 고정소수점은 어떤 실수를 '정확히' 표현하기 위해 사용된다.
점의 위치를 정하고 점을 기준으로 왼쪽은 정수부분, 우측은 소수 부분으로 인식한다.
정수부와 소수부로 합쳐서 주어진 자리까지는 입력된 값 그대로 정확히 표시할 수 있다.

Floating : 부동 소수점 자료형

부동 소수점 자료형에는 FloatDouble이 있다.
여기서의 "부동"은 부동자세할 때 그 부동이 아니다. '떠서 움직인다'는 floating의 의미다.
고정 소수점과 달리 고정되지 않고 떠다니는 것이다.

부동소수점은 실수를 '정확히' 표시하기 보다는 '더 넓은' 범위의 숫자를 표현하기 위해 사용된다.

고정소수점이 주어진 자릿수 값을 정수부와 소수부로 나눈다면, 부동소수점은 '가수'와 '지수'로 나눈다.
X곱하기 10의 Y승 의 형태로 표현되며, 점은 항상 첫자리 다음에 온다.

예를 들어 1234.567의 경우 1.234567 x 10^3과 같은 식으로 형태로 해석한다.
여기서 1.234567 부분이 X가 되고, 10^3 부분이 Y가 되겠다.

하지만 이렇게 표시하면 기존의 7자리수를 초과한다.
때문에 X에서 한자리를 포기한 후 반올림해서 1.23457 X 10^3승 이렇게 6자리와 1자리로 해서 7자리를 사용한다. 대신에 최대 10의 9승까지 더 넓은 범위의 수를 사용할 수 있는 것이다.
X를 한자리 더 희생한다면 1.2346 x 10^99로 만들 수도 있다.

이런 특성때문에 정확도를 포기하는 대신에 범위를 더 크게 얻는다고 하는 것이다.

이러한 이유로 MySQL뿐 아니라 프로그래밍에서 부동소수점으로 계산할 때는 0.1 x 1000이 99.999가 나오는 등 오차가 있을 수 있다는 것을 항상 고려하고 사용해야한다.





문자 데이터 형식

데이터 타입바이트 수설명
CHAR(n)1 ~ 255고정길이 문자형. n을 1부터 255까지 지정.
CHARACTER의 약자이며, CHAR 이라고만 하면 CHAR(1)과 동일.

CHAR(100) 인 경우 세 자리만 사용해도 나머지 97 자리를 할당.
성능은 CHAR이 VARCHAR보다 더 좋음
VARCHAR(n)1 ~ 65535가변길이 문자형. n을 사용하면 1부터 65535까지 지정 Variable Character의 약자.

VARCHAR(100) 인 경우 3글자를 저장하는 경우 3자리의 데이터 공간만 사용
BINARY(n)1 ~ 255고정길이 이진 데이터 값
VARBINARY(n)1 ~ 255가변길이 이진 데이터 값
TINYTEXT1 ~ 255255 크기의 TEXT 데이터 값
TEXT1 ~ 65535N 크기의 TEXT 데이터 값
MEDIUMTEXT1 ~ 1677721516777215 크기의 TEXT 데이터 값
LONGTEXT1 ~ 4294967295최대 4GB 크기의 TEXT 데이터 값
TINYBLOB1 ~ 255255 크기의 BLOB 데이터 값
TEXT1 ~ 65535N 크기의 BLOB 데이터 값
MEDIUMBLOB1 ~ 1677721516777215 크기의 BLOB 데이터 값
LONGBLOB1 ~ 4294967295최대 4GB 크기의 BLOB 데이터 값
ENUM(값들..)1 또는 2최대 65535개의 열거형 데이터 값
SET(값들..)1, 2, 3, 4, 8최대 64개의 중복되지 않는 데이터 값

CHAR [촬] vs VARCHAR [발촬 ㅋㅋ]

CHAR는 Character를 의미하고, 이것의 Variable(변하기 쉬운)이 붙은게 VARCHAR이다.

CHAR

CHAR는 고정된 공간을 차지한다. 어떤 컬럼을 CHAR(10)으로 설정한 다음 3글자 문자열을 넣으면 나머지 7자는 스페이스로 채워진다.

VARCHAR

VARCHAR는 CHAR와 달리 가변적인 공간을 차지한다.
CHAR처럼 무조건 정해진 만큼 차지하는 것이 아니라 입력되는 글자의 길이에 따라 그에 맞게 공간을 할당한다.

효율적인(것처럼보이는) VARCHAR를 두고, CHAR는 왜 없어지지 않을까?

딱 고정된 길이의 문자열만 들어가는 컬럼에는 CHAR를 쓰는 게 더 공간을 절약한다.
VARCHAR말 그대로 길이가 가변적이기 때문에 이 글자가 몇글자인지까지 기록을 해둬야만 컴퓨터가 이것을 어디까지 읽으면 되는지 알 수있다.
즉 글자 정보에 더해서 글자 길이 정보까지 저장한다는 것이다. 길이정보는 1,2byte정도를 더 차지하며, 연산시에 글자 길이도 계산하다보니 CHAR보다 미세하게 시간을 더 소모한다.

VARCHAR는 어차피 가변적인데 뒤에 (10) 같은 최대 길이 숫자는 왜 적어 놓는걸까?

실수 또는 악의적으로 매우 긴 문자열을 입력하는 것을 방지하기 위함이다. 용량 조절보다는 입력되는 데이터를 통제하는 게 목적이다. 성능에 있어서도 불필요하게 많이 주어진 VARCHAR의 길이값은 퍼포먼스를 저하시킬 수 있다고하니 적당히 주는게 좋겠다.


TEXT vs BLOB

TEXT

TEXT는 게시물의 본문처럼 긴 문자열을 저장할 때 사용된다.
최대 저장용량이 큰 대신 VARCHAR에 비해 제약 사항들이 있다.
VARCHAR는 문자열로 검색을 빠르게 할 수 있도록 인덱스에 포함될 수 있는데, TEXT는 이것을 앞부분에 한정으로만 걸 수 있다. (단, Full text index라는 것은 TEXT로도 가능하다.)
VARCHAR에서 가능한 default값도 TEXT에서는 줄 수 없다. 보통은 TEXT의 성능이 VARCHAR보다 떨어진다.

VARCHAR의 최대한도이자 TEXT의 크기이기도 한 65535바이트 MySQL 각 행의 최대한도이다.
때문에 VARCHAR를 max로 주게되면 다른 정보들을 넣을 수 없다.
반면에 TEXT는 VARCHAR처럼 각 행에 인라인으로 저장되는 게 아니라 다른 공간에 따로 저장되기 때문에 상관없다. 때문에 행별 데이터의 총량이 65535를 넘어가려하면 TEXT를 사용하면 된다.

인덱스
데이터에 행을 추가할 때마다 지정된 컬럼에 대해서 그 값들이 다른 시트에 따로 정렬이 된 채로 행 번호와 저장되어 그것을 기준으로 어떤 행을 검색할 때 더 빠르게 찾을 수 있도록하는 역할을 한다.

BLOB

TEXT가 글자로 된 문자열 컨텐츠를 담는 것이라면, BLOB은 같은 용량에, 바이너리 데이터를 담는데 사용된다.
TEXT와 달리 어떤 글자 종류인지 캐릭터셋을 갖지 않는다.
이미지 파일 등을 파일로 저장하지 않고 바이너리 데이터로 데이터베이스에 저장하고자 할때 사용한다.





날짜와 시간 데이터 형식

데이터 형식
바이트 수설명
DATE3날짜는 1001-01-01 ~ 9999-12-31까지 저장되며 날짜 형식만 사용 'YYYY-MM-DD' 형식으로 사용됨
TIME3-838:59:59.000000 ~ 838:59:59.000000까지 저장되며 'HH:MM:SS' 형식으로 사용
DATETIME8날짜는 1001-01-01 00:00:00 ~ 9999-12-31 23:59:59까지 저장되며 형식은 'YYYY-MM-DD HH:MM:SS 형식으로 사용
TIMESTAMP4날짜는 1001-01-01 00:00:00 ~ 9999-12-31 23:59:59까지 저장되며 형식은 'YYYY-MM-DD HH:MM:SS 형식으로 사용. time_zone 시스템 변수와 관련이 있으며 UTC 시간대로 변환하여 저장.
YEAR11901 ~ 2155까지 저장. 'YYYY' 형식으로 사용.

DATETIME vs TIMESTAMP

DATETIME

DATETIME은 날짜와 시간 의 '절대적'인 값이다. 날짜를 있는 그대로 글자로 적어넣은 것이라고 보면 된다.
이것을 어디서 누구가 읽는 다르게 보이지 않는다. 즉, 시차와 관계없이 똑같이 읽하는 것 시간이다.
DATETIME은 1000년부터 9999년까지 기록이 가능하다.

TIMESTAMP

TIMESTAMP는 상대적이다. 시간대에 영향을 받는다. 때문에 이것은 데이터가 전파돼서 저장된 곳마다 다르게 읽힌다. DATETIME은 글자그대로 저장하는 반면에, TIMESTAMP는 숫자값을 저장한다. 이는 그리니치 평균시로 1970년 1월 1일 자정부터, 입력되는 시간까지 총 몇 밀리세컨드가 지났는지를 저장한다. 때문에 같은 값도 DB가 돌아가는 서버에 세팅된 시간에 따라서 다르게 읽힐 수가 있다는 것이다.
TIMESTAMP은 1970년부터 2038년까지 기록이 가능하다.
TIMESTAMP는 행 추가시 값을 안 넣으면 자동으로 현 시간이 입력된다.




기타 데이터 형식

데이터 형식바이트 수설명
GEOMETRYN/A공간 데이터 형식으로 선, 점 및 다각형 같은 공간 데이터 개체를 저장
JSON8JSON 문서를 저장. MySQL 5.7.8 부터 지원
배열 타입 역시 지원

Tip
DB에서 Json 을 언제 사용하는 것이 좋을까?

  • 빠른 조회보다 데이터의 저장에 중점을 두는 데이터
  • 변화가 없으면서 정형화되지 않으면서 다양한 형식을 변화가 요구되는 데이터
  • 어플리케이션을 통해 데이터를 처리하고 DB에는 단순한 저장이 요구되는 데이터
  • 지속적인 데이터의 형식에 변화가 가능한 데이터

참고문헌 : Inpa Dev 블로그, 얄팍한 코딩사전

profile
최선이 반복되면 최고가 된다.

0개의 댓글