[ SQL 스터디 - 2주차 ] MySQL의 데이터 형식
위 포스트는 "혼자 공부하는 SQL" 책 Chapter 04-1 내용을 정리한 글입니다.
한빛미디어 - 혼자 공부하는 SQL (우재남 저) : 무료 동영상 강의 제공
누구를 위한 책인가요? SQL을 처음 시작하려고 하는 학생과 취업 준비생, 데이터베이스 기초를 배우고자 하는 초보 개발자, SQL의 이론과 실습을 동시에 학습하고 싶은 입문자, SQL을 공부하다가
hongong.hanbit.co.kr
Chapter 4-1. MySQL의 데이터 형
** 데이터 형식
데이터의 형식은 크게 숫자형, 문자형, 날짜형으로 나눌 수 있다.
각각의 특징에 대해 하나씩 살펴보자.
01. 정수형
정수형은 소수점이 없는 숫자에 많이 사용된다.
크기와 범위는 다음과 같다.
| 데이터 형식 | 바이트 수 | 숫자 범위 |
| TINYINT | 1 | -128 ~ 127 |
| SMALLINT | 2 | - 32,768 ~ 32,767 |
| INT | 4 | 약 -21억 ~ + 21억 |
| BIGINT | 8 | 약 -900경 ~ + 900경 |
이전 포스트에서 생성했던 member 테이블을 다시 살펴보겠다.
[ 1주차 ] SQL 기본 문법
위 포스트는 "혼자 공부하는 SQL" 책 Chapter 03 내용과 "유선배 SQL개발자(SQLD) 과외노트" 책 Part 2-1 내용을 정리한 글입니다. 한빛미디어 - 혼자 공부하는 SQL (우재남 저) : 무료 동영상 강의 제공 누구
yangheeb.tistory.com
CREATE TABLE member -- 회원 테이블
( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number INT NOT NULL, -- 인원수
addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
phone1 CHAR(3), -- 연락처의 국번(02, 031, 055 등)
phone2 CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
height SMALLINT, -- 평균 키
debut_date DATE -- 데뷔 일자
);
mem_number 열의 경우 데이터 형식이 INT로 명시되어 있지만,
할당될 데이터 값에 비해 불필요하게 숫자 범위가 넓게 설정되어 있기 때문에
데이터 형식을 숫자 범위가 적은 것으로 바꿀 필요가 있다.
mem_number TINYINT NOT NULL, -- 인원수
위 코드는 mem_number의 데이터 형식을 'TINYINT'로 바꾼 것이다.
그리고
값의 범위를 0부터 시작하고 싶을 때는
"UNSIGNED 예약어"를 사용하여 이를 표현할 수 있다.
아래의 height 변수에서 SMALLINT 데이터 형식은
- 32,768 ~ 32,767 이라는 숫자 범위를 가지고 있는 형식이다.
height SMALLINT, -- 평균 키
여기서 잠깐 !
이 height 데이터에서 2가지 수정사항이 보이지 않는가?
1. height 역시 불필요하게 숫자 범위가 넓게 설정되어 있기 때문에,
데이터 형식을 TINYINT 정도로 변경을 해주어야 한다.
2. TINYINT는 -128 ~ +127로 200cm가 넘는 사람도 존재하기에,
UNSIGNED 예약어를 사용하여 값의 범위를 0부터 시작하게 지정해야 한다.
이 2가지 문제점을 수정한 height 데이터는 다음과 같다.
height TINYINT UNSIGNED, -- 평균 키
mem_number와 height를 수정한 member 테이블이다.
CREATE TABLE member -- 회원 테이블
( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
mem_name VARCHAR(10) NOT NULL, -- 이름
mem_number TINYINT NOT NULL, -- 인원수
addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
phone1 CHAR(3), -- 연락처의 국번(02, 031, 055 등)
phone2 CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
height TINYINT UNSIGNED, -- 평균 키
debut_date DATE -- 데뷔 일자
);
'TINYINT'와 'TINYINT UNSIGNED'는
모두 1Byte의 크기를 가지고 있는 데이터라는 공통점을 가지고 있지만,
- TINYINT는 1Byte를 -128 ~ +127의 범위로 256개의 Bit로 표현하고
- TINYINT UNSIGNED는 1Byte를 0 ~ 255의 범위로 256개의 Bit를 표현하는 차이점이 있다.
02. 문자형
문자형은
글자를 저장하기 위해 사용하며, 입력할 최대 글자의 개수를 정해야 한다.
대표적인 문자형 예시인 CHAR과 VARCHAR에 대해 알아보자.
| 데이터 형식 | 바이트 수 |
| CHAR (개수) | 1 ~ 255 |
| VARCHAR (개수) | 1 ~ 16383 |
# CHAR
- 문자를 의미하는 Character의 약자
- "고정길이 문자형"이라고 부르며, 자릿수가 고정되어있음
- 글자의 개수가 고정된 경우 사용하는 것이 좋음
# VARCHAR
- Variable Character의 약자
- "가변길이 문자형"이라고 부름
- 글자의 개수가 변동될 경우에 사용하는 것이 좋음
두 문자형 방식의 차이점이 있다면
( "이태민"이라는 문자를 저장 가정 )
** CHAR(10)의 경우
: 이태민 + 7칸의 공간 낭비 -> 총 10칸 중 3칸만 저장
** VARCHAR(10)의 경우
: 이태민 -> 문자에 해당하는 길이만 저장됨. 3자리만 사용
즉 VARCHAR은
CHAR보다 공간을 효율적으로 운영할 수 있는 장점이 있지만,
MySQL 내부적으로 성능면에서는 CHAR보다 조금 약하다는 단점이 있다.
cf1) 문자형에는 위 예시 이외에도 BINARY, VARBINARY 있지만 잘 사용하지 않는다
cf2) 단순히 CHAR, VARCHAR로만 표시한다면 CHAR(1), VACHAR(1)과 동일하다
03. 대량의 데이터 형식
문자형인 CHAR는 최대 255자까지, VARCHAR는 최대 16383자까지 지정이 가능하다.
그뿐만 아니라 더 큰 데이터 형식을 지정할 수 있는데, 형식은 아래과 같다.
| 데이터 형식 | 바이트 수 | |
| TEXT 형식 | TEXT | 1 ~ 65535 |
| LONGTEXT | 1 ~ 4294967295 (약 42억자) | |
| BLOB 형식 | BLOB | 1 ~ 65535 |
| LONGBLOB | 1 ~ 4294967295 | |
이때 BLOB형식은
Binary Long Object의 약자로, 글자가 아닌 이미지, 동영상 등의 데이터를 말한다.
그리고 이것을 "이진(Binary) 데이터"라고도 부른다.
대량의 텍스트, 대량의 이진테이터는
각각 LONGTEXT, LONGBLOB로 설정하며, 데이터는 최대 4GB까지 입력할 수 있다.
04. 실수형
실수형은 소수점이 있는 숫자를 저장할 때 사용한다.
| 데이터 형식 | 바이트 수 | 설명 |
| FLOAT | 4 | 소수점 아래 7자리까지 표현 |
| DOUBLE | 8 | 소수점 아래 15자리까지 표현 |
과학 기술용 데이터가 아닌 이상 FLOAT이면 충분하다.
05. 날짜형
날짜형은 날짜 및 시간을 저장할 때 사용한다.
| 데이터 형식 | 바이트 수 | 설명 |
| DATE | 3 | 날짜만 저장 YYYY-MM-DD 형식으로 사용 |
| TIME | 3 | 시간만 저장 HH:MM:SS 형식으로 사용 |
| DATETIME | 8 | 날짜 및 시간을 저장 YYYY-MM-DD HH:MM:SS 형식으로 사용 |
** 변수의 사용
MySQL에서 변수의 선언과 값의 대입은 다음 형식을 따른다.
SET @변수이름 = 변수의 값; -- 변수의 선언 및 값 대입
SELECT @변수이름; -- 변수의 값 출력
변수는 MySQL 워크벤치를 재시작할 때까지는 유지되지만, 종료하면 없어진다.
그러므로 임시로 사용한다고 생각하면 된다.
market_db 데이터베이스를 지정한 후 SET으로 myVar1와 myVar2 변수를 선언해보자.
myVar1 변수에는 정수형, myVar2 변수에는 실수형 값이 대입되었다.
USE market_db;
SET @myVar1 = 5;
SET @myVar2 = 4.25;
SELECT를 이용해 변수 myVar1 내용을 출력하면 다음과 같으며,
SELECT @myVar1;

myVar1와 myVar2 변수끼리 연산한 후에 출력하면 다음과 같다.
SELECT @myVar1 + @myVar2;
변수를 선언하고 문자열 또는 정수를 대입 **8 더 적기
SET @txt = '가수 이름 ==> ';
SET @height = 166;
SELECT @txt, mem_name FROM member WHERE height> @height;
** 데이터 형 변환
데이터의 형 변환이란
문자형을 정수형으로 바꾸거나, 반대로 정수형을 문자형으로 바꾸는 것을 말한다.
이 데이터 형 변환은 크게 2가지 방식이 있는데, 이에 대해 각각 알아보자.
01. 함수를 이용한 명시적인 변환
명시적인 형 변환은
직접 함수를 사용해서 데이터 형을 변환하는 방식이다.
이때 사용하는 변환함수는 CAST(), CONVERT()이다.
CAST ( 값 AS 데이터_형식 [(길이)] )
CONVERT ( 값, 데이터_형식 [(길이)] )
이 함수들은 형식만 다를 뿐 동일한 기능을 하며,
CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등의 데이터 형식이 함수 안에 올 수 있다.
cf) SIGNED는 부호가 있는 정수, UNSIGNED는 부호가 없는 정수를 의미
변환 함수 사용 예시를 살펴보자.
SELECT CAST(AVG(price) AS SIGNED) '평균 가격' FROM buy;
SELECT CONVERT(AVG(price), SIGNED) '평균 가격' FROM buy;
CAST() 함수, CONVERT() 함수 모두 같은 실행결과가 나오는 것을 확인할 수 있다.
02. 암시적인 변환
암시적인 형 변환은
함수를 사용하지 않고 데이터 형을 변환하는 방식이다.
CASE 1 ) 문자열의 자동 변환
SELECT '100'+'200';
문자는 더할 수 없으므로 자동으로 숫자 100과 200으로 변환해서 덧셈을 수행한다.
따라서 위 코드의 출력 결과는 300이다.
SELECT 100 + '200';
숫자 100은 원래부터 정수형 데이터 형이기에 200만 숫자로 반환되어 동일한 300의 결과가 나온다.
CASE 2 ) CONCAT() 함수
CONCAT() 함수는
문자를 이어주는 역할을 하는 함수이다.
아래의 예시와 같이 CONCAT()함수는
문자 '100'과 '200'을 연결하여 '100200'가 출력한다.
SELECT CONCAT('100','200');>> 100200
CASE1의 예시처럼 숫자와 문자를 CONCAT()함수로 연결해보자.
SELECT CONCAT( 100,'200');>> 100200
CASE1에서는 200이 정수형 데이터로 변환되어 300이라는 결과를 얻을 수 있었지만,
CASE2의 경우는 숫자 100이 문자 '100'으로 변환되어 연결되었다.