mac 로컬 환경에 mysql을 설치해서 데이터를 마이그레이션 하는도중에
datetime로 선언된 필드에서
Field 'expired' doesn't have a default value:
이런 에러가 났다.
어느정도 삽질후에 datetime 필드를 not null 로 했을때 insert 혹은 update를 하면서 아무값도 넣지 않으면
에러가 나는 것을 확인할수 있었는데, 실제 서비스에도 저렇게 되어있어서 datetime 필드의 설정을 바꿀수도없고... 다른 해결책을 찾다가
발견한 것이 있는데
mysql strict mode라는 것이다.
이건 mysql 을 설치하면 기본으로 설정되어있는것인데,
이게 무엇인지 단적으로 설명하자면
not null로 된 필드에 값을 넣지 않으면 에러가 나고 값이 들어가지 않게 하는 것이다.
mysql korea문서에는 이렇게 써있다.
스트릭트 모드는 MySQL가 유효하지 않거나 누락된 (missing) 데이터를 처리하는 방법을 제어한다. 하나의 값은 여러 가지 이유로 유효하지 않게 된다. 예를 들면, 컬럼에 대해 틀린 데이터 타입을 가질 수가 있거나, 또는 범위를 벗어날 수도 있다. 삽입될 새로운 열이 자신의 정의문 안에서 명확한 DEFAULT
구문이 없는 비-NULL컬럼 값을 가지고 있지 않을 때 데이터는 누락 된다. (NULL 컬럼의 경우, NULL은 값이 누락되는 경우에 삽입된다.)
즉 값을 안정성있게 넣는 것이라는건데
이걸 알고나서 개인적으로 이 모드를 사용하는게 좋은게 아닐까라는 짧은 생각이 든다.
어찌댔든 현재 내 환경을 그렇지 않으므로 이 모드를 해제 해야 하는데
*nix계열의 운영체제에서는
my.cnf 파일을 찾아서 sql_mode에 STRICT_TRANS_TABLES 라는 옵션을 지우고 mysql을 재시작하면 이 옵션은 꺼지게된다.
windows계열은
my.ini파일을 찾아서 똑같이 하면된다고 한다.
혹시나 orm을 쓰는 개발자는 orm자체에서도 이 옵션이 설정될 수도 있으므로 my.cnf에서 설정을 끈후에 orm에서도 disable명령어가 있는지 찾아보는게 좋은것 같다.
왜냐면 나도 active-record를 쓰는데 mysql옵션을 껐는대도 계속 저옵션에 걸려 에러가 났는데 알고보니 active-record에서도 저 옵션을 켜서 사용 하고 있었다
'Mysql' 카테고리의 다른 글
mac 에서 ERROR! The server quit without updating PID file 에러 (0) | 2016.08.01 |
---|---|
mysql]insert 서브쿼리 사용법 (0) | 2015.02.23 |
mysql] 쿼리문에서 문자열 붙이기 (0) | 2015.02.23 |
[MySql] alter (0) | 2014.08.22 |
mysql 테이블 데이타 복사 (0) | 2014.07.08 |
WRITTEN BY
- rabbbit
필기