서버 SQL 모드
서버 SQL 모드
MySQL 서버는 여러 개의 SQL 모드(SQL mode)로 동작할 수 있어요. 그리고 이 모드를 클라이언트마다 다르게 적용할 수도 있는데요, 그걸 결정하는 게 sql_mode 시스템 변수예요. DBA는 전역 SQL 모드를 사내 서버 운영 요구에 맞게 설정하고, 각 애플리케이션은 세션 SQL 모드를 자기 요구에 맞게 바꿀 수 있어요. SQL 모드가 뭘 하는 친구인지, 중요한 모드들은 무엇인지 살펴볼게요.
기본 SQL 모드
MySQL 8.4의 기본 SQL 모드에는 다음 모드들이 포함돼요.
ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATENO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_ENGINE_SUBSTITUTION
SQL 모드 설정하기
SQL 모드는 명령줄에서 --sql-mode="" 처럼 옵션으로 지정하거나, 옵션 파일에서 sql-mode=""로 설정할 수 있어요. 빈 문자열로 지정하면 기본 모드를 끌 수도 있죠. 다만 주의할 점이 있는데, 이미 사용자 정의 파티셔닝을 사용하는 테이블을 만든 뒤에는 SQL 모드를 바꾸지 않는 게 좋아요. SQL 모드가 달라지면 저장된 데이터 해석이 어긋날 수 있거든요.
세션 단위로는 SET SESSION sql_mode = '...'처럼 설정해서 현재 연결에만 적용할 수 있어요.
핵심 SQL 모드들
STRICT_TRANS_TABLES— 비트랜잭션 테이블에서, 단일 행 문장이거나 다중 행 문장의 첫 행에서 잘못된 값이 나오면 문장을 중단시켜요. "엄격 모드(strict mode)"의 핵심이에요.TRADITIONAL— MySQL이 "전통적인" SQL 데이터베이스처럼 행동하게 해요. SQL 표준에 가깝게 동작하죠.
매뉴얼에서 "엄격 모드"라고 할 때는 STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 중 하나라도 켜진 상태를 의미해요.
엄격 모드가 실패를 오류로 바꾼다
핵심 동작을 한 문장으로 정리하면, 엄격 SQL 모드에서는 서버가 일부 경고(warning)를 오류(error)로 승격시켜요. 예를 들어 누락된 값이나 잘못된 값이 들어오면 경고만 남기고 넘어가던 걸, 엄격 모드에서는 실패로 처리해서 데이터 품질 문제를 조기에 잡아주는 거예요.
InnoDB 테이블과 strict 모드
InnoDB 테이블을 다룰 때는 innodb_strict_mode 시스템 변수도 함께 고려하는 게 좋아요. 이 변수를 켜면 InnoDB 테이블에 대해 추가적인 오류 검사를 해주거든요.
더 알아보기
- 전체 SQL 모드 목록과 각 모드의 효과:
Section 7.1.11, "Server SQL Modes"의 Full List IGNORE키워드와 엄격 모드의 비교innodb_strict_mode시스템 변수