이 글은 "TCPschool/코딩과 데이터/MySQL"을 읽고 주관적으로 작성된 글입니다.

https://tcpschool.com/mysql/intro
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
1. 숫자 타입
1) 타입(data type)
- 테이블의 필드별로 저장할 수 있는 타입 명시
 - 숫자 타입
- 문자열 타입
- 날짜와 시간 타입
 
2) 숫자 타입
- SQL 표준에서 지원하는 모든 숫자 타입 제공
- 정수 타입
- 고정 소수점 타입
- 부동 소수점 타입
- 비트값 타입
 
3) 정수 타입(integer type)
- MySQL이 제공하는 SQL 표준 정수 타입
 - INTEGER(INT)
- SMALLINT
 
- MySQL이 제공하는 확장 정수 타입
- TINYINT
- MEDIUMINT
- BIGINT
 
- 각 타입은 저장공간과 표현 범위가 다름
- SIGNED / UNSIGNED 구분
- 저장공간
- TINYINT : 1byte
- SMALLINT : 2byte
- MEDIUMINT : 3byte
- INT : 4byte
- BIGINT : 8byte
 
- 예제
- Reservation 테이블의 Price 필드를 추가
 
ALTER TABLE Reservation
ADD Price INT;4) 고정 소수점 타입(fixed-point type)
- DECIMAL
 - 실수의 값을 정확하게 표현하기 위해 사용
- 고정 소수점 방식은 소수부의 자릿수를 미리 정한 자릿수로 고정하여 표현
- DECIMAL(M,D)
 - M : 소수 부분을 포함한 실수의 총 자릿수 (<= 65)
 - D : 소수 부분의 자릿수 (0이면 소수 부분이 없음)
 
- NUMERIC
- NUMERIC(M,D)
 - M : 정수 부분의 자릿수
 - D : 소수 부분의 자릿수
- 대부분의 경우 DECIMAL과 같은 동작
 
- NUMERIC(M,D)
- 예제
- 아래에서 수정한 필드 RoomNum은 -99999.99 ~ 99999.99 범위의 값을 가짐
 
ALTER TABLE Reservation
MODIFY COLUMN RoomNum DECIMAL(7,2);5) 부동 소수점 타입
- FLOAT / DOUBLE
 - 실수의 값을 대략적으로 표현하기 위해 사용
- FLOAT는 4byte, DOUBLE은 8byte
 
- 정밀도에 필요한 비트수 명시
- FLOAT(P)
 - P의 범위가 0~24면 FLOAT, 25~53이면 DOUBLE로 취급
- FLOAT(M,D) / DOUBLE(M,D)
 - 비표준 방법으로 DECIMAL과 같이 M은 실수의 총 자릿수, D는 소수 부분의 자릿수
 
- FLOAT(P)
- 예제
- 위 DECIMAL(7,2)와 같음
 
ALTER TALBE Reservation
MODIFY COLUMN RoomNum FLOAT(7,2);6) 비트값 타입
- BIT
- 비트의 값을 저장
- 0과 1로 구성되는 바이너리 값
- BIT(M)
 - M의 범위 (1 ~ 64)
 - M비트보다 짧은 값은 앞에 0을 추가하여 자동으로 길이 맞춤
 
- BIN()
- 바이너리 값을 출력하는 함수
 - b'110
 
- 바이너리 값을 출력하는 함수
- 예제
ALTER TABLE Reservation
ADD Code BIT(7);
2. 문자열 타입
1) 문자열 타입
- CHAR와 VARCHAR
- BINARY와 VARBINARY
- BLOB과 TEXT
- ENUM
- SET
2) CHAR와 VARCHAR
- CHAR / VARCHAR 차이
- 저장 방식 / 추출 방식
- 최대 길이를 다루는 방식
 
- 문자열의 길이
 - CHAR(M)
 - 고정 길이의 문자열
 - M의 범위 (0~255)
 - M보다 작은 문자열은 공백을 채워 M의 길이로 맞춤
- VARCHAR
 - 가변 길이의 문자열
 - M의 범위 (0~65,535)
 - 입력된 문자열의 길이만큼 저장 / 사용
 
- CHAR(M)
- 예제
ALTER TABLE Reservation ADD Note CHAR(4);
INSERT INTO Reservation(Note) VALUES(' ');
INSERT INTO Reservation(Note) VALUES('ab');
INSERT INTO Reservation(Note) VALUES('abcd');
INSERT INTO Reservation(Note) VALUES('abcdefgh');
ALTER TABLE Reservation MODIFY COLUMN Note VARCHAR(4);
INSERT INTO Reservation(Note) VALUES(' ');
INSERT INTO Reservation(Note) VALUES('ab');
INSERT INTO Reservation(Note) VALUES('abcd');
INSERT INTO Reservation(Note) VALUES('abcdefgh');| 입력값 | CHAR(4) | 필요한 저장공간 | VARCHAR(4) | 필요한 저장공간 | 
| '' | ' ' | 4byte | '' | 1byte | 
| 'ab' | 'ab ' | 'ab' | 3byte | |
| 'abcd' | 'abcd' | 'abcd' | 4byte | |
| 'abcdefgh' | 'abcd' | 'abcd' | 4byte | 
3) BINARY와 VARBINARY
- CHAR / VARCHAR와 비슷함
- 문자 집합이 아닌 바이너리 데이터를 저장할 때 사용됨
ALTER TABLE Reservation
ADD Bin_str BINARY(M);
ALTER TABLE Reservation
MODIFY COLUMN Bin_str VARBINARY(M)4) BLOB과 TEXT
- BLOB
 - Binary Large Object
- 다양한 크기의 바이너리 데이터 저장
- 종류
 - TINYBLOB
 - BLOB
 - MEDIUMBLOB
 - LONGBLOB
 
- TEXT
- VARCHAR와 비슷함
- VARCHAR와 달리 기본값(DEFAULT)을 가질 수 없음
- BLOB과 달리 문자열의 대소문자를 구분함
- 종류
 - TINYTEXT
 - TEXT
 - MEDIUMTEXT
 - LONGTEXT
 
- 예제
ALTER TALBE Reservation
ADD COLUMN Note TEXT;5) ENUM
- 미리 정의한 집합 안의 요소 중 하나만 저장 가능한 타입
- 장점
 - 가독성이 올라감
- 특정 숫자에 문자열로 의미 부여 가능
 
- 범위 : 65,535개의 ENUM 데이터 포함 가능
- 내부적으로 정수로 변환되어 인식
- 0부터 1씩 증가하며 각각 대응됨
- 0은 빈 문자열('')과 대응, 첫 번째 요소는 1부터 대응
- 따라서, 아래 필드에서 INSERT INTO VALUES에 'Single'은 그대로 저장, 정수 2는 두 번째인 'Twin'으로 저장
 
ALTER TABLE Resrvation
ADD COLUMN RoomType ENUM('Single', 'Twin', 'Double', 'Triple');6) SET
- 미리 정의한 집합 안의 요소 중 여러 개를 동시에 저장할 수 있는 타입
- 범위 : 최대 64개 SET 데이터 포함 가능
- 예제 
- SET 목록 집합에서 1개 이상 값을 저장
- 단, 문자열 내에서 여러 개의 값은 쉼표를 사용하여 값 사이를 구분해야함
 
ALTER TABLE Reservation
MODIFY COLUMN Request SET('Breakfast', 'Extra Bed', 'Non-Smoking');
INSERT INTO Reservation(Request)
VALUES('Breakfast,Extra Bed')
3. 날짜와 시간 타입
1) 날짜와 시간 타입
- DATE, DATETIME, TIMESTAMP
- TIME
- YEAR
2) DATE, DATETIME, TIMESTAMP
- DATE
- 날짜를 저장하는 타입
- 기본 형식 : 'YYYY-MM-DD'
- 범위 : '1000-01-01' ~ '9999-12-31'
 
- DATETIME
 - 날짜 + 시간을 저장하는 타입
- 기본 형식 : 'YYYY-MM-DD HH:MM:SS'
- 범위 : '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
 
- TIMESTAMP
- 날짜와 시간을 나타내는 타임스탬프 저장
- 사용자가 별다른 입력을 주지 않고, 데이터가 마지막으로 입력/변경된 시간이 자동 저장
- 데이터의 최종 변경 시각의 저장/확인에 유용
- 범위 : UTC '1970-01-01-00:00:01' ~ '2038-01-19 03:14:07'
 
- 위 3개 타입 모두, 입력받은 데이터가 유효하지 않으면 0으로 저장
- 예제
ALTER TABLE Reservation
MODIFY COLUMN ReserveDate DATETIME;3) TIME
- 시간을 저장하는 타입
- 기본 형식 : 'HH:MM:SS' 또는 'HHH:MM:SS'
- 범위 : '-838:59:59' ~ '838:59:59'
- 범위 초과시 최소/최대 값으로 자동 변환
- 유효하지 않으면 '00:00:00'
- 예제
ALTER TALBE Reservation
ADD COLUMN CheckIn TIME;4) YEAR
- 연도를 저장하는 타입
- YEAR(4)는 4자리 (MySQL 5.7.5부터 YEAR(2) deprecated)
- 숫자와 문자열 모두 저장 가능하지만, 결과가 달라짐
 - YEAR(4) + 숫자
 - 범위 : 1901 ~ 2155
- YEAR(4) + 문자
 - 범위 : 1901 ~ 2155
 
- YEAR(4) + 숫자
- 예제
ALTER TABLE Reservation
ADD COLUMN ThisYear YEAR;'CS > MySQL' 카테고리의 다른 글
| [프로그래머스][SQL][SELECT] 모든 레코드 조회하기 (0) | 2021.08.06 | 
|---|---|
| [TCPschool][4장] 연산자와 함수 (0) | 2021.08.06 | 
| [TCPschool][2장] MySQL 문법(2/2) (0) | 2021.08.01 | 
| [TCPschool][2장] MySQL 문법 (1/2) (0) | 2021.07.28 | 
| [TCPschool][1장] MySQL 시작 (0) | 2021.07.24 |