MariaDB | 데이터 타입과 형변환

2025. 1. 31. 11:40기반기술/Database

데이터 타입

카테고리 주요 타입  특징 
숫자 TINYINT, INT, BIGINT 정수 데이터 저장
  FLOAT, DOUBLE, DECIMAL 실수 데이터 저장
문자열 CHAR, VARCHAR, TEXT 짧거나 긴 문자열 저장
날짜/시간 DATE, DATETIME, TIMESTAMP 날짜와 시간 저장
기타 BOOLEAN, JSON, ENUM, SET 특수 데이터 저장

 

  • MySQL은 여러 가지 데이터 유형을 지원한다. (문자열, 숫자, 날짜, 시간 등)
  • 적절한 데이터 유형을 정의하면 데이터 저장 공간을 효율적으로 사용하고 데이터 입력의 유효성 검사에도 도움이 된다.

1. 숫자(Numeric) 데이터 타입

정수 타입 (Integer Types)

타입 크기 (Bytes) 범위 (Signed) 범위 (Unsigned)
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32,768 ~ 32,767 0 ~ 65,535
MEDIUMINT 3 -8,388,608 ~ 8,388,607 0 ~ 16,777,215
INT / INTEGER 4 -2,147,483,648 ~ 2,147,483,647 0 ~ 4,294,967,295
BIGINT 8 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 0 ~ 18,446,744,073,709,551,615
  • UNSIGNED 옵션을 붙이면 음수를 제외한 2배 범위를 사용할 수 있다.
  • TINYINT(1)처럼 숫자를 지정하는 것은 자릿수 표시(출력 형식)일 뿐, 저장 크기와는 관계없음

실수 타입 (Floating Point Types)

타입 크기 (Bytes) 설명
FLOAT(M, D) 4 소수점 포함 7자리 정도의 정밀도
DOUBLE / REAL 8 소수점 포함 16자리 정도의 정밀도
DECIMAL(M, D) / NUMERIC(M, D) 가변적 정확한 소수 표현 (금융 데이터에 적합)
  • FLOAT과 DOUBLE은 근사값(부동소수점) 저장이라 오차가 생길 수 있음
  • DECIMAL은 문자열처럼 저장되어 오차가 없음 → 금융 데이터에 많이 사용

 

2. 문자열(String) 데이터 타입

고정 길이 문자열 (Fixed-length)

타입 크기 설명
CHAR(M) 1~255 bytes 고정 길이 문자열 (M 지정, 기본값 1)
BINARY(M) 1~255 bytes 고정 길이 이진 데이터 (문자 아닌 바이너리)
  • CHAR(10) → 10자리를 무조건 채움! (짧으면 공백 추가)
  • BINARY(10) → 바이너리 데이터 저장 (공백도 포함)
  • 장단점 
    • 고정 길이로 문자열을 저장하기 때문에, 저장되는 데이터의 크기가 일정하고 처리 속도가 빠를 수 있어. (예: 고정된 길이의 코드나 국가 코드 등)
    • 검색할 때 성능이 일정하게 유지될 수 있음.
    • 데이터가 짧을 경우, 공간이 낭비될 수 있다. 예를 들어, 길이가 5인 CHAR(10)에 "abc"를 저장하면 나머지 7자리는 공백으로 채워져 저장 공간이 비효율적일 수 있음.

가변 길이 문자열 (Variable-length)

타입 크기 설명
VARCHAR(M) 1~65,535 bytes 가변 길이 문자열 (M까지 저장, 길이 가변)
VARBINARY(M) 1~65,535 bytes 가변 길이 이진 데이터
  • VARCHAR(10) → 최대 10자, 길이에 맞게 저장됨 (공백 없음)
  • 가변길이 문자열이기 때문에 헤더에는 레코드의 길이에 대한 정보가 포함되어야 한다. 
  • TEXT와 달리 VARCHAR는 인덱스 생성 가능
  • 장단점
    • 가변 길이 문자열로, 필요한 만큼만 공간을 차지해서 저장 공간을 효율적으로 사용할 수 있다. 예를 들어, VARCHAR(255)에 "abc"를 저장하면 실제로 3바이트만 차지하고, 나머지 공간은 사용하지 않음 
    • 길이가 가변적이기 때문에, 처리 속도가 CHAR보다 상대적으로 느릴 수 있음. 하지만 일반적인 경우에는 그 차이가 미미함. 데이터가 자주 변경되거나, 크기가 매우 큰 문자열의 경우에는 성능 저하가 있을 수 있음.
    • 대부분의 경우 문자열의 길이가 고정되지 않기 때문에, VARCHAR를 쓰는 것이 공간 효율적이고 유연하여 추천된다. 

긴 텍스트 (Long Text)

타입 크기 설명
TEXT 최대 65,535 bytes 가변 길이 텍스트 (긴 문자열 저장용)
TINYTEXT 최대 255 bytes 작은 텍스트
MEDIUMTEXT 최대 16MB 중간 크기 텍스트
LONGTEXT 최대 4GB 매우 긴 텍스트
  • TEXT 계열은 VARCHAR보다 크지만, 인덱스 제한이 있음

 

3. 날짜 및 시간(Date & Time) 데이터 타입

타입 크기 (Bytes) 형식 설명
DATE 3 YYYY-MM-DD 날짜 (연-월-일)
DATETIME 8 YYYY-MM-DD HH:MI:SS 날짜 + 시간 (초까지)
TIMESTAMP 4 YYYY-MM-DD HH:MI:SS DATETIME과 유사하지만, UTC 기반
TIME 3 HH:MI:SS 시간(시:분:초)
YEAR 1 YYYY 연도 (1901~2155)
  • TIMESTAMP는 UTC(세계 표준시) 기준으로 저장 → 타임존 변경 가능
  • DATETIME은 서버 시간대와 무관하게 그대로 저장됨

 

4. 기타 데이터 타입

타입 설명
BOOLEAN TINYINT(1)과 동일 (0: FALSE, 1: TRUE)
JSON JSON 형식의 데이터를 저장 가능
ENUM 미리 정의된 값 중 하나 선택
SET 미리 정의된 여러 개의 값 선택 가능
  • ENUM('small', 'medium', 'large') → 하나의 값만 저장 가능
  • SET('A', 'B', 'C') → 여러 개의 값 선택 가능 ('A,B' 저장 가능)

형 변환 

1. 명시적 형변환 

  • CAST (expression AS 데이터형식 [(길이)])
  • CONVERT (expression, 데이터형식 [(길이)])
  • 데이터 형식으로 가능한 것은 BINARY, CHAR, DATE, DATETIME, DECIMAL, JSON, SIGNED INTEGER, TIME, UNSIGNED INTEGER 등이 있다.
SELECT AVG(menu_price) FROM tbl_menu;
SELECT CAST(AVG(menu_price) AS SIGNED INTEGER) AS '평균 메뉴 가격' FROM tbl_menu;
SELECT CONVERT(AVG(menu_price), SIGNED INTEGER) AS '평균 메뉴 가격' FROM tbl_menu;

SELECT CAST('2023$5$30' AS DATE); -- 2023-05-30
SELECT CAST('2023/5/30' AS DATE); -- 2023-05-30

 

2. 암시적 형변환

  • 따로 처리하지 않아도 내부적으로 자동으로 형변환이 이루어진다.
SELECT '1' + '2';    				-- 각 문자가 정수로 변환됨
SELECT CONCAT(menu_price, '원') FROM tbl_menu;    -- menu_price가 문자로 변환됨
SELECT 3 > 'MAY';   				 -- 문자는 0으로 변환된다.

SELECT 5 > '6MAY';   -- 문자에서 첫번째로 나온 숫자는 정수로 전환된다.
SELECT 5 > 'M6AY';   -- 숫자가 뒤에 나오면 문자로 인식되어 0으로 변환된다.
SELECT '2023-5-30';  -- 날짜형으로 바뀔 수 있는 문자는 DATE형으로 변환된다.