mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/06/27 ~ 2023/07/03 #58

Open danbi5228 opened 1 year ago

danbi5228 commented 1 year ago

다음 스터디

2023-07-03 pm 10:30 09:30 월요일

정리 범위

  1. 15.1.6 ~ 15.2.4
  2. 15.2.5 ~ 15.3.1 전까지 (~p.394)
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 단비
  2. 장현
mojh7 commented 1 year ago

15.2 숫자

15.2.5 자동 증가 (AUTO_INCREMENT) 옵션 사용

숫자 타입의 칼럼에 자동 증가 옵션을 사용해 인조 키(Artificial Key)를 생성할 수 있다

AUTO_INCREMENT 자동 증가값 변경


AUTO_INCREMENT 옵션을 사용한 칼럼

PK나 유니크키가 여러 개의 칼럼을 구성되면?

// AUTO_INCREMENT 칼럼을 PK의 뒤쪽에 배치해 테이블 생성 시 오류 발생
CREATE TABLE tb_autoinc_innodb (
    fd_pk1 INT NOT NULL DEFAULT '0',
    fd_pk2 INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (fd_pk1, fd_pk2)
) ENGINE=INNODB

// AUTO_INCREMENT 칼럼이 PK 뒤에 배치되어 있으나 유니크 키에서 제일 선두에 위치하여 정상적으로 테이블이 생성됨
CREATE TABLE tb_autoinc_innodb (
    fd_pk1 INT NOT NULL DEFAULT '0',
    fd_pk2 INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (fd_pk1, fd_pk2)
    UNIQUE KEY ux_fdpk2 (fd_pk2)
) ENGINE=INNODB


AUTO_INCREMENT

CREATE TABLE tb_autoinc_innodb (
    fd_pk1 INT NOT NULL DEFAULT '0',
    fd_pk2 INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (fd_pk1, fd_pk2)
    UNIQUE KEY ux_fdpk2 (fd_pk2)
) ENGINE=INNODB AUTO_INCREMENT=7;

자동 증가값이 1이 아닌 7부터 시작되니 개발용 서버에서 SHOW CREATE TABLE명령으로 조회한 DDL 내용 그대로 서비스용 MySQL에다가 사용할 때 자동 증가값이 1이 아닌 값으로 설정되니 조심


15.3 날짜와 시간

날짜 혹은 시간만 따로 저장할 수 있다

날짜와 시간을 합쳐서 하나의 칼럼에 저장할 수 있게 여러 가지 타입을 지원


MySQL 5.6부터 TIME과 DATETIME, TIMESTAMP 타입은 밀리초 단위의 데이터를 저장할 수 있게됨


MySQL 날짜 타입은 칼럼 자체에 타임존 정보가 저장되지 않는다

하지만 TIMESTAMP는 항상 UTC 타임존으로 저장되므로 타임존이 달라져도 값이 자동으로 보정된다


주의

SET timezone='...' 명령을 실행할 때 Unknown or incorrect time zone: 'Asia/Seoul' 와 같은 에러가 발생하면?


자바 응용 앱에서 타임존을 한국 서울로 한 경우와 미국 로스앤젤레스로 변경했을 때 MySQL 서버의 데이터 차이

  1. JVM 타임존이 한국 서울

    • datetime, timestamp 모두 2020-09-10 09:25:23.0
  2. JVM 타임존이 미국 로스앤젤레스

    • datetime, timestamp 모두 2020-09-10 17:25:23.0


MySQL 서버의 칼럼 타입 datetime, timestamp에 상관없이 JDBC 드라이버는 날짜 및 시간 정보를 MySQL 타임존에서 JVM의 타임존으로 변환해서 출력함


요즘은 Hibernate나 MyBatis 등과 같은 ORM을 사용하기에 코드 내부에서 DATETIME 칼럼값을 어떤 JDBC API를 이용해서 페치하는지, 타임존 변환이 기대하는데로 작동하는지 테스트 해보기를 권장함


이미 데이터를 가지고 있는 MySQL 서버의 타임존을 변경해야 한다면?

하지만 TIMESTAMP 타입의 값은 항상 UTC로 저장되기에 MySQL 서버의 타임존을 변경한다고 해서 별도로 변환 작업이 필요로 하지 않는다


system_time_zone 시스템 변수는 MySQL 서버의 타임존을 의미

time_zone 시스템 변수는 MySQL 서버로 연결하는 모든 클라이언트 커넥션의 기본 타임존을 의미

time_zone 시스템 변수에 아무것도 설정하지 않으면?

danbi5228 commented 1 year ago

15.1.6 문자열 이스케이프 처리

15.2 숫자

15.2.1 정수

15.2.2 부동 소수점

15.2.3 DECIMAL

15.2.4 정수 타입의 칼럼을 생성할 때의 주의사항