CS/MySQL

[TCPschool][3장] 타입

pythaac 2021. 8. 4. 13:10
이 글은 "TCPschool/코딩과 데이터/MySQL"을 읽고 주관적으로 작성된 글입니다.

https://tcpschool.com/mysql/intro

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

1. 숫자 타입

1) 타입(data type)

  • 테이블의 필드별로 저장할 수 있는 타입 명시
    1. 숫자 타입
    2. 문자열 타입
    3. 날짜와 시간 타입

2) 숫자 타입

  • SQL 표준에서 지원하는 모든 숫자 타입 제공
    1. 정수 타입
    2. 고정 소수점 타입
    3. 부동 소수점 타입
    4. 비트값 타입

3) 정수 타입(integer type)

  • MySQL이 제공하는 SQL 표준 정수 타입
    1. INTEGER(INT)
    2. SMALLINT
  • MySQL이 제공하는 확장 정수 타입
    1. TINYINT
    2. MEDIUMINT
    3. 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과 같은 동작
  • 예제
    • 아래에서 수정한 필드 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는 소수 부분의 자릿수
  • 예제
    • 위 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) 문자열 타입

  1. CHAR와 VARCHAR
  2. BINARY와 VARBINARY
  3. BLOB과 TEXT
  4. ENUM
  5. SET

2) CHAR와 VARCHAR

  • CHAR / VARCHAR 차이
    • 저장 방식 / 추출 방식
    • 최대 길이를 다루는 방식
  • 문자열의 길이
    • CHAR(M)
      - 고정 길이의 문자열
      - M의 범위 (0~255)
      - M보다 작은 문자열은 공백을 채워 M의 길이로 맞춤
    • VARCHAR
      - 가변 길이의 문자열
      - M의 범위 (0~65,535)
      - 입력된 문자열의 길이만큼 저장 / 사용
  • 예제
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
  • 예제
ALTER TABLE Reservation
ADD COLUMN ThisYear YEAR;