Study/DB

[MySQL] sql_mode 설정값의 의미 및 역할

 

sql_mode란?

sql_mode는 MySQL 데이터베이스 서버에서 SQL 문법과 동작을 제어하는 설정값들의 집합입니다.

이 설정은 데이터 무결성을 보호하고 특정 SQL 동작의 일관성을 유지하며, 에러가 발생하지 않도록 합니다.

 

MySQL sql_mode 공식 문서 바로가기

 

MySQL :: MySQL 8.0 Reference Manual :: 7.1.11 Server SQL Modes

The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable. DBAs can set the global SQL mode to match site server operating requirements, and each

dev.mysql.com

 

 

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 모드를 활성화합니다.