Database

[MySQL] - 데이터 형식, 형 변환

KAispread 2023. 3. 5. 13:36
728x90
반응형

데이터베이스에는 다양한 데이터 형식이 존재합니다. 크게 숫자형, 문자형, 날짜형으로 시작하여, 세부적으로도 여러 데이터 형식으로 나눌 수 있습니다.

데이터 베이스에 저장되는 데이터의 형태는 실제로 아주 다양하기 때문에, 각 데이터에 맞는 데이터 형식을 지정함으로써 효율적으로 저장할 수 있습니다. 본 포스팅에서는 MySQL에서 자주 사용되는 데이터 형식을 위주로 정리해보겠습니다.

 


데이터 형식

📌 정수형

형식 바이트 수  범위 UNSIGNED
TINYINT  1 -128 ~ 127 0 ~ 255
SMALLINT  2 -32768 ~ 32767 0 ~ 65535
INT  4 약 -21억 ~ 21억 0 ~ 약 42억
BIGINT  8 약 -900경 ~ 900경 0 ~ 약 1800경
  • 정수형은 소수점이 없는 숫자, 즉 인원 수, 가격, 수량 등에 많이 사용합니다. 추가로 BIT, MEDIUMINT 도 있으나 잘 사용하지 않습니다. 
  • 정수형에 UNSIGNED 예약어를 붙이면 범위가 0부터 시작되는 양의 정수 범위로 데이터의 범위를 지정할 수 있습니다.

예시

CREATE TABLE member (
    mem_id INT PRIMARY KEY,
    mem_number TINYINT
    height TINYINT UNSIGNED
)

 

 

📌 실수형

형식 바이트 수  특징
FLOAT 4 소수점 아래 7자리 까지 표현
DOUBLE 8 소수점 아래 15자리 까지 표현
  • 실수형은 소수점이 있는 숫자를 저장할 때 사용합니다.
  • 과학 기술용 데이터가 아닌 이상 대부분 FLOAT로 지정하면 충분합니다.

 

 

📌 문자형

형식 바이트 수  특징
CHAR(개수) 1 ~ 255 고정길이 문자형
VARCHAR(개수) 1 ~ 16383 가변길이 문자형
  • 문자형은 글자를 저장하기 위해 사용합니다.
  • 테이블 생성시 입력할 최대 글자의 개수를 지정해야합니다.
  • CHAR고정길이 문자형입니다.
    • 데이터 형식을 CHAR(10)로 지정하면 해당 컬럼은 저장되는 데이터의 크기와 상관없이 무조건 10 바이트를 차지합니다.
    • CHAR(10) 'abc' 저장 → 10바이트 차지
  • VARCHAR가변길이 문자형입니다.
    • 데이터 형식을 VARCHAR(10)로 지정하면 해당 컬럼은 저장되는 데이터의 크기에 따라 할당되는 바이트 수가 정해집니다. 
    • VARCHAR(10) 'abc' 저장 → 3바이트 차지
VARCHARCHAR 보다 공간 효율면에서 우수하지만, MySQL 내부 성능에서는 CHAR이 조금 더 좋습니다.

따라서, 글자수가 고정된 경우 (연락처 등)에는 CHAR을, 고정되어있지 않은 경우(팀 이름 등) 에는 VARCHAR을 사용하는 것이 좋습니다.

 

예시

CREATE TABLE member (
	mem_id CHAR(8) NOT NULL PRIMARY KEY,
	mem_number TINYINT NOT NULL,
	phone1 CHAR(3), -- 연락처 국번 02, 010
	phone2 CHAR(8)  -- 연락처 나머지
);
  • 연락처를 정수형으로 지정할경우 010이나 02 같은 국번에서 앞에 있는 0이 사라지게 됩니다.
  • 또한, 연락처는 더하기, 빼기등의 사칙 연산에 대한 필요가 없고, 대소비교에 대한 필요도 없기 때문에 문자형으로 저장합니다.

 

 

📌 대량 데이터 형식

형식 바이트 수 
TEXT 형  TEXT 1 ~ 65535
LONGTEXT 1 ~ 4294967295
BLOB 형 BLOB 1 ~ 65535
LONGBLOB 1 ~ 4294967295
  • CHAR이나 VARCHAR로는 각각 최대 255자, 16383자까지만 지정이 가능합니다. 따라서, 더 큰 데이터를 저장하기 위해 TEXTBLOB 형식을 사용합니다.
  • TEXT은 최대 65535자까지,  LONGTEXT는 최대 42억자까지 저장이 가능합니다. 영화 대본이나 소설과 같은 대량의 텍스트를 저장할 때 지정합니다.
  • BLOBBinary Long Objecct의 약자로, 글자가 아닌 이미지나 동영상 등의 데이터를 저장한다고 생각하면 됩니다. 마찬가지로 대량의 데이터를 저장하고 싶다면 LONGBLOB을 사용합니다.

예시

CREATE TABLE movie (
	movie_id CHAR(8) NOT NULL PRIMARY KEY,
	movie_number TINYINT NOT NULL,
	movie_script LONGTEXT,
	movie_film   LONGBLOB
);

 

 

📌 날짜형

형식 바이트 수  설명
DATE 3 날짜만 저장 'YYYY-MM-DD' 형식으로 사용
TIME 3 시간만 저장 'HH:MM:SS' 형식으로 사용
DATETIME 8 날짜와 시간을 저장 'YYYY-MM-DD HH:MM:SS' 형식으로 사용
  • 날짜형은 날짜 및 시간을 저장할 때 사용합니다.
  • DATE는 날짜만, TIME은 시간만, DATETIME은 시간과 날짜를 모두 저장할 때 사용합니다.
  • 날짜 또는 시간을 입력할 때는 문자와 마찬가지로 작은 따옴표로 묶어주어야합니다.

예시

CREATE TABLE movie (
	movie_id CHAR(8) NOT NULL PRIMARY KEY,
	movie_number TINYINT NOT NULL,
	movie_script LONGTEXT,
	movie_film   LONGBLOB,
    create_date  DATE
);

-- DATE 삽입
INSERT INTO movie(movie_id, movie_number, create_date) VALUES('BLS', 4, '2022-02-02');

 

 


데이터 형 변환

💠 함수를 이용한 명시적인 변환

  • CAST(), CONVERT() 함수로 직접 데이터의 형식을 바꿀 수 있습니다. 
  • 이를 명시적인 변환이라고 합니다.
CAST (값 AS 데이터_형식 [(길이)])
CONVERT (값, 데이터_형식 [(길이)])

예시

-- 실수 → 정수 변경
SELECT CONVERT(AVG(price), SIGNED) '평균 가격' FROM buy;
SELECT CAST(AVG(price) AS SIGNED) '평균 가격' FROM buy;

-- 날짜형 변경 (다양한 구분자를 날짜형으로 변경 가능)
SELECT CAST('2022&02&12' AS DATE); -- 2022-02-12
SELECT CAST('2022/02/12' AS DATE); -- 2022-02-12

-- SQL 결과를 원하는 형태로도 표현 가능
SELECT num, CONCAT(CAST(price AS CHAR), 'X' CAST(amount AS CHAR), '=') AS '가격X수량'
	FROM buy;

 

💠 암시적인 반환

  • CAST()CONVERT() 함수를 사용하지 않고도 자연스럽게 형이 변환되는 것을 암시적인 변환이라고 합니다.
SELECT '100' + '200';  -- 300
SELECT 100 + '200';  -- 300

SELECT CONCAT(100, '200');  -- 100200 / 자동 문자형 형변환
주의
숫자와 문자를 더하거나, 비교할 때 MySQL에서는 숫자가 우선시 됩니다.
따라서, 문자를 저장하는 컬럼에 대해 숫자를 조건절로 걸었다면, 모든 컬럼에 대해 문자 → 숫자의 형 변환이 일어나게 되므로 성능에 엄청난 영향을 끼칠수 있습니다.

 

728x90
반응형