sql_mode란?
sql_mode는 MySQL 데이터베이스 서버에서 SQL 문법과 동작을 제어하는 설정값들의 집합입니다.
이 설정은 데이터 무결성을 보호하고 특정 SQL 동작의 일관성을 유지하며, 에러가 발생하지 않도록 합니다.
sql_mode 설정
SQL 모드는 글로벌 및 세션 레벨에서 설정할 수 있습니다. 글로벌 설정은 서버가 시작될 때 적용되며, 세션 설정은 각 클라이언트 연결에 적용됩니다.
sql_mode 확인
현재 설정된 sql_mode를 확인하려면 다음 쿼리를 사용합니다.
SELECT @@sql_mode;
sql_mode 설정
SQL 모드를 설정하려면 다음 쿼리를 실행합니다.
SET GLOBAL sql_mode = '모드1,모드2,...';
SET SESSION sql_mode = '모드1,모드2,...';
기본 sql_mode
MySQL에 기본적으로 설정되어있는 sql_mode 값입니다.
ONLY_FULL_GROUP_BY
ONLY_FULL_GROUP_BY는 GROUP BY에 없는 절이 HAVING 절이나 SELECT 조회 컬럼, ORDER BY 절에 사용되지 않도록 막는 옵션입니다.
STRICT_TRANS_TABLES
STRICT_TRANS_TABLES는 트랜잭션 스토리지 엔진에 대해 엄격한 SQL 모드를 활성화하고, 가능하면 비트랜잭션 스토리지 엔진에 대해서도 활성화합니다.
이 모드에서는 데이터 입력 규칙이 엄격하게 적용되며, 잘못된 데이터나 누락된 데이터가 입력되는 것을 방지합니다.
NO_ZERO_IN_DATE
NO_ZERO_IN_DATE는 월이나 일에 0이 포함된 날짜를 허용하지 않는 옵션입니다.
MySQL 8.0에서는 deprecated된 옵션입니다.
NO_ZERO_DATE
NO_ZERO_DATE는 '0000-00-00'처럼 년도나 월이나 일에 0이 포함된 날짜를 허용하지 않습니다.
ERROR_FOR_DIVISION_BY_ZERO
ERROR_FOR_DIVISION_BY_ZERO는 0으로 나누기 연산을 시도할 때 사용되는 옵션입니다.
MySQL 8.0에서는 deprecated된 옵션입니다.
NO_ENGINE_SUBSTITUTION
NO_ENGINE_SUBSTITUTION은 CREATE TABLE이나 ALTER TABLE과 같은 구문을 사용할 때 기본 스토리지 엔진을 자동으로 대체하는 것을 방지하는 옵션입니다.
그 외 설정 값
기본 설정값 외에도 많은 옵션들이 존재합니다.
sql_mode | 설명 |
ALLOW_INVALID_DATES | '2024-04-31'과 같은 잘못된 날짜를 허용하는 옵션입니다. DATE나 DATETIME 타입에 적용되며, TIMESTAMP에는 적용되지 않습니다. |
ANSI_QUOTES | 큰따옴표(")나 백틱(`)를 사용하여 문자열을 인용할 수 없습니다. |
HIGH_NOT_PRECEDENCE | NOT 조건의 우선순위를 높여서 조건을 처리합니다. |
IGNORE_SPACE | 함수 이름과 괄호 사이에 공백을 허용합니다. |
NO_AUTO_VALUE_ON_ZERO | AUTO_INCREMENT가 설정된 컬럼에 적용됩니다. 시퀀스 번호가 0으로 생성되지 않게 합니다. |
NO_BACKSLASH_ESCAPES | 문자열이나 식별자 내부에서 이스케이프 문자로 백슬래시 문자(\)를 사용할 수 없고 일반 문자로 처리됩니다. |
NO_DIR_IN_CREATE | 테이블을 생성할 때 INDEX DIRECTORY와 DATA DIRECTORY 옵션을 무시합니다. |
NO_UNSIGNED_SUBTRACTION | 부호 없는 정수에 빼기를 했을 때 결과가 음수면 음수로 표시합니다. |
PAD_CHAR_TO_FULL_LENGTH | 검색 시 char 타입에 지정된 길이만큼 채워져서 나옵니다. deprecated된 옵션입니다. |
PIPES_AS_CONCAT | || 연산자를 or 절이 아닌 concat으로 처리합니다. |
REAL_AS_FLOAT | REAL을 FLOAT의 동의어로 취급합니다. 기본적으로 MySQL은 REAL을 DOUBLE로 취급합니다. |
STRICT_ALL_TABLES | 모든 스토리지 엔진에 대해 엄격한 SQL 모드를 활성화합니다. |
TIME_TRUNCATE_FRACTIONAL | 시간이 잘리는 경우 잘림 처리를 합니다. 기본 설정은 반올림입니다. |
SQL_MODE 설정 예제
다음 예제는 기본 SQL 모드를 설정하는 방법입니다.
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
이 예제는 STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_ENGINE_SUBSTITUTION 모드를 활성화합니다.