이미 존재하는 프로젝트를 Mysql 5.7 이전 버전에서 5.7로 업그레이드 후 Data 를 밀어 넣고 프로젝트를 올리면
보통 데이터 삽입 로직에서 에러를 맞게 된다.
이는 대부분, '등록일' 필드와 '수정일' 필드 중 '수정일' 필드가 공백으로 insert query상 작성되어 아래와 같은 에러를 맞게 되는 것.
Error Number: 1292
Incorrect date value: '0000-00-00' for column 't_updated_at' at row 1
INSERT INTO `task_tb`
(`t_title`, `t_content`, `t_created_at`, `t_updated_at`)
VALUES
('전화하기', '마눌님께 전화하기', '2020-01-11 11:11:11', '0000-00-00 00:00:00')
기존 버전에서 Insert 잘 되던 소스인데 갑자기 잘못된 날짜 값이라며 에러를 낸다.
이 때 대처법. 아래 문서를 참조하였다.
mysql -u root -p
> 루트 암호 입력
## 현재 설정값 확인
mysql> SELECT @@GLOBAL.sql_mode;
mysql> SELECT @@SESSION.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
이 중 NO_ZERO_DATE 가 이를 막아 에러를 낸 것. MySQL5.3쪽에서 이를 확인 해 보면 그저 공백이다.
MySQL5.7부터는 유효성 검사를 더욱 철저히 하여 예기치 않은 오류를 막자는 취지이나
기존 프로젝트가 갑자기 돌아가지 않는 상황에서는 강화 정책을 이 전 버전과 맞추어 해결함이 나은 듯.
물론 주어진 시간과 여유가 주어진다면 이 제약조건에서도 문제 없는 소프트웨어를 만드는 것이 더 이상적이다.
mysql> set GLOBAL sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> set SESSION sql_mode = '';
Query OK, 0 rows affected, 1 warning (0.00 sec)
두번째 쿼리는 현재 커넥션 된 지금 콘솔 세션에서의 sql_mode를 지워주는 거라서 안해줘도 된다.
첫번째 글로벌 설정만 변경 후 exit 후 재접속 해서 확인 해 봐도 아래와 같이 변경 되어있다.
mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
즉, 첫번째 GLOBAL sql_mode 쿼리는 꼭 수행 해야 함.
Global_mode 는 변경 해 주지 않고, 두번째 쿼리만 수행하면 exit 후 재 접속시 원래대로 돌아와 있고
웹 프로세스상 커넥션도 기존대로 유지되므로 위 문제는 해결 되지 않는다.