본문 바로가기

소프트웨어 이야기/데이터 저장소 + 시각화

[MySQL][Out Of Range] sql_mode Strict Type과 아닌 것의 차이

참고 - [Mysql]Out-Of-Range and Overflow Handling


어느날 이런 이슈가 있었다.

MySql에 int type으로 설정한 컬럼이 있었다.

그런데 테스트용 DB에서는 int에서 허용하는 값의 범위를 초과할 경우, Warn 경고를 주면서 알아서 값을 줄여줬다. 

(Mysql에서 Int가 허용하는 값은  -2147483648 ~ 2147483647 사이이다. 즉 Int로 타입이 선언된 컬럼에 2147483648 이상의 값을 저장하면, 2147483647의 값이 저장된다.)


그런데 같은 테이블을 백업해둔 다른 DB에서는 int에서 허용하는 값 이상을 저장하면 Out-of-Range Mysql error가 나면서, 알아서 값을 줄여주지 않았다.


두개의 DB가 데이터 오버플로우에 대한 처리 방식이 달랐다. 그래서 두 DB의 설정의 차이에 대해서 찾아보았다. 

DB의 버전 차이 때문인지, 설정의 차이인지 찾아보았다.

그 결과, 이 둘의 차이는 sql_mode였다. 


알아서 허용된 값 범위내로 값을 수정해서 저장해주었던 DB는 sql_mode가 따로 설정되어있지 않았다.

그런데 허용된 값 이상을 저장할 때 에러가 발생했던 DB는 sql_mode가 strict로 설정되어 있었다.



즉 ! 

SQL MODE를 Strict mode로 설정하면, 컬럼이 허용하는 값 이상으로 저장하면 Error를 내뱉는다! Strict mode가 아니면 알아서 값을 잘라서 저장해준다!

난 Strict Mode 별로다!