mysql8 datetime 0000:00:00 에러 발생 시

2021. 3. 30. 15:53MS_SQL

1. 현재 설정된 모드 확인 쿼리

show variables like 'sql_mode'

 mysql server sql modes 확인

 

MySQL :: MySQL 8.0 Reference Manual :: 5.1.11 Server SQL Modes

The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable. DBAs can set the global SQL mode to match site server operating requirements, and each

dev.mysql.com

2. sql_mode 수정

- 서버

- my.cnf에서 sql_mode 설정

[mysqld]
sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"

- mysql 재시작

- mysql

- 모드 설정
SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

- 변경 내용 확인
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

 

3. 옵션명 및 설명

  • STRICT_ALL_TABLES : 일반적으로 MySQL에서는 저장하려는 값의 길이가 칼럼의 길이보다 더 긴 경우라 하더라도 에러가 발생하지 않고, 칼럼의 길이를 초과하는 부분은 버리고 남은 부분만 저장한다. (경고 메시지 발생)
    이 옵션을 주면, 칼럼의 정해진 길이보다 큰 값을 저장할때 경고가 아닌 에러를 발생시킨다.
  • STRICT_TRANS_TABLES : MySQL 서버는 칼럼의 타입과 호환되지 않는 값을 저장할때 최대한 바꿔서 저장한다.
    이 옵션을 주면, 원하지 않는 데이터 타입의 변환이 필요할때 에러를 발생시킨다.
  • ANSI_QUOTES : 홀따옴표만 문자열 값 표기로 사용할 수 있고, 쌍따옴표는 칼럼명이나 테이블명과 같은 식별자를 표기하는 데만 사용할 수 있다.
  • ONLY_FULL_GROUP_BY : GROUP BY 절에 포함되지 않은 칼럼을 집합함수로 감싸야만 사용할 수 있게 해준다.
  • PAD_CHAR_TO_FULL_LENGTH : CHAR 타입의 칼럼값을 가져오는 경우, 뒤쪽의 공백이 제거되지 않고 반환되도록 한다.
  • IGNORE_SPACE : 프로시저나 함수명과 괄호 사이의 공백을 무시한다.
  • ANSI : 위에서 언급된 여러 옵션을 조합해 MySQL 서버가 최대한 SQL 표준에 맞게 동작하게 만들어준다.
  • 출처 : lannstark.tistory.com/38