DBMS - Day3 데이터 타입, 열 속성

김지원·2022년 6월 13일
0

DBMS

목록 보기
4/17

CREATE SCHEMA `study1`;

스키마 study1 을 만들어준다 .

테이블 생성

              ↓ 스키마 이름 ↓ 테이블 이름
CREATE TABLE `study1`.`table1`();

테이블 이름은 복수형으로 짖는다.
테이블을 만들 때 ( );안에 안에 것을 같이 써줘야한다.

1. 열 이름 명시 + 타입 명시

age는 숫자이니 숫자타입으로 명시해줘야한다.

타입을 명시할 때는 열의 타입에 대해서 적어줘야 하는데 그 전에 데이터타입에 대해서 알고 있어야 한다.


데이터 타입

정수형

부호가 없는 정수는 뒤에 UNSIGNED를 붙인다.

TINYINT

: 1 byte, -128 ~ 127

  • TINYINT UNSIGNED : 1byte, 0 ~ 255 (부호 없으니 255까지 적을 수 있다.)

SMALLINT

: 2 Bytes, -32768 ~ 32767, 부호 없을 시 0 ~ 65536

MEDIUMINT

: 3 Bytes, -8388608 ~ 8388607, 부호 없을 시 0 ~ 16777215

INT

: 4 Bytes, -2147483648 ~ 2147483647, 부호 없을 시 0 ~ 4294967295

BIGINT

: 8 Bytes,
92233720036854775808 ~ 92233720036854775807 (992경),
부호 없을 시 0~18446744073709551615 (1844경)
타입 뒤에 (n)을 붙여 자리수 제한 가능. 가령 TINYINT(1)은 -9~9까지 표현 가능
용량이 크면 클 수록 데이터가 느려진다. (하드의 용량을 차지한다.)

속도면에서는 BIGINT가 유리하다.
4byte = 32bit
8byte = 64bit
-> CPU가 한번에 데이터를 처리하는 단위이다.


실수형(소수형)

DOUBLE

: 8 Bytes, 1.7976931348623157E+308 ~ 1.7976931348623157E+308

  • 특성상 연산 오류가 발생하여 소숫점 뒷자리가 버려지거나 연산상 오류가 발생할 수 있음
  • float(4byte)도 존재하는데 오류가 심각해서 크게 사용하지 않는다.

특유의 계산방법때문에 연산 오류가 발생하게 된다.
BIGINT가 8byte이고 DOUBLE도 8byte인데 DOUBLE이 범위가 훨씬 크다. 그렇기에 오류가 발생하기도 해서 논리적으로 계산이 필요할 때 DOUBLE과 FLOAT를 사용하지 않는다.

부동소수점

DECIMAL(a,b)

: ( a + 1 ) Bytes, a는 전체 자리 길이, b는 소수점 자리 길이

  • 정수 한 자리, 소숫점 두 자리를 원한다면, DECIMAL(3,2)가 맞음.
  • 용량이 큰 대신, FLOAT이나 DOUBLE이 가지는 한계인 연산 오류가 없음.
  • 가령, DECIMAL(5, 2) 는 -999.99 부터 999.99이다.
  • UNSIGNED 된다.

날짜 / 시간

DATE

: 3 Bytes, 년 / 월 / 일

TIME

: 3 Bytes, 시 / 분 / 초

DATETIME(n)

: 8 Bytes, 년 / 월 / 일 시 : 분 : 초

  • 0000-01-01 00:00:00 ~ 0000-12-31 23:59:59
  • (n) 부여시 n자리 만큼 소숫점도 가진다.
  • 가령 DATATIME(3)은 000-00-00 00:00:00'000 형식

TIME 타입과 DATETIME 타입은 뒤에 (n)을 붙여 밀리초를 포함할 수 있다.
가령 DATETIME(3) 타입은 yyyy-MM-dd HH:mm:ss'SSS 까지 표현할 수 있다.

TIMESTAMP

: 4Bytes, 년 / 월 / 일 시 : 분 : 초

  • 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07
  • UNIX 시간을 가진다.
  • UNIX 시간 저장 : 1970년 1월 1일 0시 0분 0초 부터 지금 까지 지난 시간 초로 나타낸 값.
  • UNIX 시간이 2147483647을 넘으면 오버플로우(overflow)가 발생해 0으로 돌아간다. 이 일시가 2030-01-19 03:14:07이고 이런 문제를 2038문제라고 한다.
  • 시스템 시간이 변경될 때 함께 변경된다.

YEAR

: 1 Bytes, 년

😺 DATETIME와 TIMESTAMP는 작동원리가 다르다.

=> TIMSTAMP는 UNIX 시간으로 돌아간다.

TIMESTAMP를 사용하는 이유

< example >
dt1 DATATIME 2000-01-01 00:00:00
dt2 TIMESTAMP 2001-01-01 00:00:00 가 있다고 하자.
내가 시스템에서 현재 시간을 밀면 TIMESTAMP 은 그만큼 같이 밀린다.

  • '2038년 문제' 검색 해보기.Year 2038 Problem

기타

논리

BOOLEAN

: 1Byte, 참(Ture) / 거짓(False) 값만 가진다.

  • 실제로는 TINYINT(1)로 작동하며 0은 거짓, 1은 참으로 작동함.

문자

VARCHAR(n)

: 2n Bytes, 최대 65535 Bytes, n개의 문자를 담는다.

  • 한 테이블 내에 존재하는 모든 VARCHAR 길이의 합이 65535를 초과하면 안된다.
  • 바이트 단위가 아니다. 글자수 단위로 사용한다.
    ex > VARCHAR(10) : 언어 구분 없이 10자
  • 빈 공간을 차지하지 않는다.

TINYTEXT(n)

: n Bytes, 최대 65535 Bytes, 이때 n은 최대 255.

TEXT(n)

: n Bytes, 최대 65535 Bytes, 문자를 담는다.

MEDIUMTEXT(n)

: n Bytes, 최대 16777125 Bytes, 문자를 담는다.

LONGTEXT(n)

: n Bytes, 최대 4292967295 Bytes, 문자를 담는다.

VARCHAR vs TEXT 차이점

< example >
t1 VARCHAR(65535) 'a'
=> 1Byte만 사용한다.
t1 TEXT(65535) 'a'
=> 65535Byte 다 사용한다.

😺 그렇다면 TEXT를 왜 사용하는가?

모든 VARCHAR의 합이 65535를 초과할 때는 VARCHAR를 사용하지 못하기 경우도 생기기 때문이다.


이진 데이터

:업로드 한 데이터를 데이블에 담고자 할 때 사용. ( 첨부파일, 사용자 프로필 사진 등 )

65535 Bytes = 거의 60KB

TINYBLOB(n)

: n Bytes, 최대 255 Bytes, 이진(Binary) 데이터를 담는다.

BLOB(n)

: n Bytes, 최대 65536 Bytes, 이진(Binary) 데이터를 담는다.

MEDIUMBLOB(n)

: n Bytes, 최대 16777215 Bytes, 이진(Binary) 데이터를 담는다.

LONGBLOB(n)

: n Bytes, 최대 4294967295 Bytes, 이진(Binary) 데이터를 담는다.


열 속성

NOT NULL

: 해당 열 값이 비어있을 수 없음을 의미

DEFAULT x

: 해당 열 값이 명시되지 않은 경우

  • (NOT NULL 여부와 무관하게) 기본 값으로 x 사용

AUTO_INCREMENT

: 해당 열 값에 대해 명시되지 않은 경우 1부터 시작하여 자동 증가한 값을 사용

  • 해당 열이 기본키(Primary Key)일 때에만 작동

타입을 이렇게 사용 할 수 있다!

              ↓ 스키마 이름 ↓ 테이블 이름(복수형)
CREATE TABLE `study1`.`table1` (
     ↓ 열 이름
    `age` TINYINT UNSIGNED NOT NULL DEFAULT 1,
          ↑ 타입            ↑ 속성
    `name` VARCHAR(5)
);
profile
Software Developer : -)

0개의 댓글