MySQL 컬럼의 데이터 타입

Lunar Dev·2024년 7월 8일

MySQL

목록 보기
4/4

데이터 타입 (DataType)

데이터 타입(Data Type)은 우리말로 자료형이라고도 부른다.
컬럼에 저장될 데이터의 유형을 의미하고 데이터 타입에는 크게 문자형, 숫자형, 날짜형이 있다
이 외에도 다양한 유형이 있지만 기본은 이 세가지이다

INDEX


문자형

기본이면서 가장 많이 사용하는 것이 문자형이다

Char(n)

CHAR는 고정 길이 문자형으로, 소괄호 안의 숫자 n은 저장될 문자 값의 길이를 뜻한다.
예를 들어 Name CHAR(10)이라고 컬럼을 정의하면 Name 컬럼에는 최대 10개의 문자를 입력할 수 있다
CHAR(10) 이라고 선언하고 'abcd'라는 4개의 문자를 입력하면 나머지 6개의 문자는 공백으로 채워진다
단, 이 데이터를 조회하면 공백이 사라진채 보인다.
n의 최댓값은 255이므로 최대 255개의 문자를 저장할 수 있다.

VARCHAR(n)

VARCHAR는 가변 길이 문자형으로, 실제 입력되는 문자의 길이만큼 저장된다.
예를 들어 VARCHAR(10)이라고 선언하고 'abcd'를 입력하면 공백 없이 'abcd' 4개의 문자가 저장된다
n의 최댓값은 65,535(64KB)이다
VARCHAR 타입은 실제 값의 길이만큼 저장될 뿐만 아니라 CHAR보다 더 많은 값을 저장할 수 있어서
CHAR보다는 VARCHAR 타입을 주로 사용한다

TEXT

TEXT는 VARCHAR보다 더 큰 문자 값을 저장할 때 사용하며, 저장할 수 있는 최대 크기에 따라
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT로 나뉜다.

  • TINYTEXT : 255Byte(255개 문자)
  • TEXT : 64KB(65,535개 문자)
  • MEDIUMTEXT : 16MB(16,777,215개 문자)
  • LONGTEXT : 4GB(4,294,967,295개 문자)

BLOB

BLOB은 Binary Large Object의 약어로, 이미지처럼 크기가 큰 데이터를 저장할 때 사용한다
BLOB은 저장할 수 있는 최대 크기에 따라 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB으로 나뉜다

  • TINYBLOB : 255Byte
  • BLOB : 64KB
  • MEDIUMBLOB : 16MB
  • LONGBLOB : 4GB

ENUM

ENUM은 특정 값의 목록을 정해 놓고 이 목록에 있는 값들만 입력할 수 있는 문자열 객체 타입이다
예를 들어 ENUM('small', 'medium', 'large') 라고 선언했다면 이 컬럼에는 이 3가지 값만 입력할 수 있다

여기서 소개한 문자형 외에도 BINARY, VARBINARY, SET이 있지만, 주로 사용하는 문자형은 VARCHAR 이다


숫자형

숫자형 역시 문자형처럼 많이 사용하는 데이터 타입이다
MySQL에서 제공하는 숫자형은 크게 정수형과 실수형으로 나뉜다
숫자형 데이터를 선언할 때 MySQL에서는 2가지 옵션을 붙일 수 있다

  • UNSIGNED
  • ZEROFILL

UNSIGNED는 부호가 없다는 뜻으로, 0과 0보다 큰 수만 입력할 수 있다
따라서 UNSIGNED를 명시하면 양수만, 명시하지 않으면 양수와 음수 모두 입력할 수 있다
저장 가능한 범위가 -10에서 10까지 라고 했을 때 UNSIGNED가 붙으면 0에서 20까지이다
즉, 숫자 범위는 유지한 채 음수가 저장될 공간을 양수로 넓힌다고 보면 된다.

ZEROFILL은 빈자리를 0으로 채워 저장한다는 뜻이다
선언된 크기에서 입력된 숫자의 자리를 뺴고 남은 나머지 자리를 0으로 채운다
ZEROFILL을 붙이면 MySQL은 자동으로 UNSIGNED 옵션을 추가한다
그런데 ZEROFILL 옵션은 MySQL 8.0.17 버전을 기준으로 DEPRECATED 되었다
이후 해당 옵션을 사용하려면 LPAD 함수를 사용하면 된다

정수형

TINYINT(1byte) [(M)] [UNSIGNED] [ZEROFILL]

TINYINT는 -128에서 127 사이의 정수를 저장할 수 있는 데이터 타입이다
만약 UNSIGNED 옵션을 붙이면 0에서 255까지 저장할 수 있다 []로 표시한 부분은 생략할 수 있다

(M)에는 저장할 수 있는 크기를 명시하는데, 모든 정수형 데이터 타입에서 크기를 지정하는 부분은
MySQL 8.0.17 버전을 기준으로 DEPRECATED 되었다

TINYINT(1)이나 TINYINT(3)이나 저장할 수 있는 최대 정수는 127이다
따라서 M은 사용하지 말고 TINYINT만 명시하자

SMALLINT(2byte) [(M)] [UNSIGNED] [ZEROFILL]

SMALLINT는 -32,768에서 32,767까지의 정수를 저장할 수 있는 데이터 타입이다
UNSIGNED를 붙이면 0에서 65,535까지 저장할 수 있다
여기서도 (M)은 사용하지 말고 SAMLLINT만 명시하자

MEDIUMINT(3byte) [(M)] [UNSIGNED] [ZEROFILL]

MEDIUMINT는 SMALLINT보다 더 큰 정수를 입력할 때 사용한다
-8,388,608에서 8,388,607까지 저장할 수 있고,
UNSIGNED를 명시하면 0에서 16,777,215까지 저장할 수 있다

INT(4byte) [(M)] [UNSIGNED] [ZEROFILL]

INT는 -2,147,483,647 에서 2,147,483,648까지,
UNSIGNED를 명시하면 0에서 4,294,967,295 까지 저장할 수 있다
음수를 포함하면 대략 -21억에서 21억까지이다 INT 대신 INTEGER라고 명시해도 된다
이 둘은 같은 의미이다

BIGINT(8byte) [(M)] [UNSIGNED] [ZEROFILL]

BIGINT는 숫자 범위가 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지로
조를 넘어서 경까지 숫자를 저장할 수 있다
UNSIGNED를 명시하면 0에서 18,446,744,073,709,551,615까지 가능하다

💡 그래서 소수점은?

정수형은 정수만 입력할 수 있고 소수점이 있는 실수는 사용할 수 없다 가령 INT로 선언한 후
10.43이란 값을 입력하면 소수점 이하 첫째 자리를 기준으로 반올림해 소수점 이하 숫자는 잘리고
10이 입력된다. 10.53은 소수점 이하 첫째 자리가 5이므로 반올림해 11이 입력된다
입력할 때 오류는 발생하지 않지만, 정확한 값이 입력되지 않는다.

실수형

DECIMAL [(M, D)] [UNSIGNED] [ZEROFILL]

DECIMAL은 고정 소수 실수형으로, M은 전체 자릿수를, D는 소수점 이하 자릿수를 의미한다
M은 소수점 이하 자릿수를 포함해 최대 65자리 까지 저장할 수 있다
M을 생략하면 기본적으로 10이 적용된다

D는 최대 30자리까지 지정 가능하다 D를 명시하지 않거나 0을 명시하면 소수점 이하 숫자는 없다는 뜻이다
DECIMAL 대신 DEC, FIXED, NUMERIC을 써도 되며, 모두 DECIMAL과 같은 데이터 타입이다
하지만 혼란스러울 수 있으니 DECIMAL만 사용하자

DOUBLE(8byte) [(M, D)] [UNSIGNED] [ZEROFILL]

DOUBLE은 부동 소수 실수형으로, M과 D는 각각 전체 자릿수와 소수점 이하 자릿수를 의미한다
DOUBLE은 DECIMAL과 달리 근사값을 저장한다 따라서 입력하는 값의 자릿수가 15자리를 넘어가면
부정확한 값이 저장된다
DOBULE은 1.7976931348623157E+308에서 -2.2250738585072014E-308, 0,
2.2250738585072014E-308에서 1.7976931348623157E+308까지의 실수를 저장할 수 있다

DOUBLE보다 작은 크기의 값을 저장하는 FLOAT도 있다

SQL에서 일반적인 숫자 값을 저장하고 연산하는 데는 이 정도면 충분하다
주로 실수형은 정확한 값을 저장하는 DECIMAL을, 정수형은 INT를 사용하면 된다
단, 정수형은 입력하는 값의 크기에 따라 다른 정수형을 사용해도 된다


날짜형

날짜형 데이터 타입은 날짜와 시간을 입력하는 데 사용한다

DATE

DATE는 1000-01-01부터 9999-12-31까지 날짜를 지원한다
날짜를 표시하는 형식은 국가마다 다른데, MySQL에서는 기본적으로 'YYYY-MM-DD' 형식을 사용한다
4자리 연도와 2자리 월, 2자리 일을 사용한다
예를 들어 2024년 07월 03일은 2024-07-03으로 표시한다

DATETIME[(fsp)]

DATETIME은 날짜뿐만 아니라 시간까지 입력할 수 있다 MySQL에서 사용하는 기본 형식은
'YYYY-MM-DD hh:mm:ss[.fraction]' 이다 여기서는 hh는 시간을, mm은 분을, ss는 초를
fraction은 소수점 이하 초를 의미한다 (fsp)는 fractional seconds precision으로
소수점 이하 초의 정밀도 자릿수를 뜻한다 0에서 6까지 넣을 수 있고, 생략하면 0이 적용된다
만약 6을 명시하면 소수점 이하 여섯째 자리까지 초를 저장할 수 있다
따라서 DATETIME은 1000-01-01 00:00:00.000000 부터 9999-12-31 11:59:59.999999까지 지원한다

💡 TIP

MySQL 공식 문서에 따르면 DATE와 DATETIME이 지원하는 값의 범위는 1000년 1월 1일부터지만,
그 이전 날짜 (예, 0001년 1월 1일)를 넣는 것도 가능하다
다만 이런 경우에는 입력된 값을 보장하지 않는다고 명시하고 있다

TIME[(fsp)]

TIME은 시간, 즉 시, 분, 초를 입력하는 데이터 타입이다 여기서도 (fsp)는 0에서 6까지 넣을 수 있고
생략하면 0이 적용된다
기본 형식은 hh:mm:ss[.fraction]으로 -838:59:59.000000에서 838:59:59.000000 까지의 시간 값을 입력가능하다

YEAR

YEAR는 4자리 연도를 입력할 수 있는 데이터 타입으로, 0000년과 1901년부터 2155년까지 입력할 수 있다

일반적으로 날짜만 사용하기보다는 날짜와 시간을 같이 사용하는 경우가 많아서 날짜형에서는
DATETIME을 가장 많이 사용한다 이 외에도 TIMESTAMP가 있는데,
TIMESTAMP는 DATETIME을 확장한 타입으로 시간대(TimeZone) 정보까지 입력할 수 있다

profile
저장소

0개의 댓글