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형으로 변환된다.