이 글은 "TCPschool/코딩과 데이터/MySQL"을 읽고 주관적으로 작성된 글입니다.
https://tcpschool.com/mysql/intro
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 |