SQL 모드 설정
SET GLOBAL sql_mode = ' modes ';
SET SESSION sql_mode = ' modes ';
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
가장 중요한 SQL 모드
가장 중요한 sql_mode 값은 아마도 다음과 같습니다.
• ANSI
이 모드는 구문 및 동작을 변경하여 표준 SQL과보다 밀접하게 일치합니다. 이 절의 끝에 나열된 특수 조합 모드 중 하나입니다.
• STRICT_TRANS_TABLES
값이 트랜잭션 테이블에 주어진대로 삽입 될 수 없으면 문을 중단하십시오. 비 트랜잭션 테이블의 경우, 값이 단일 행 문 또는 다중 행 문의 첫 번째 행에서 발생하면 명령문을 중단합니다. 자세한 내용은이 섹션 뒷부분에 나와 있습니다.
MySQL 5.7.5부터 기본 SQL 모드에는 STRICT_TRANS_TABLES 포함됩니다.
• TRADITIONAL
MySQL이 " 전통적인 " SQL 데이터베이스 시스템처럼 동작하도록합니다. 이 모드의 간단한 설명은 잘못된 값을 열에 삽입 할 때 " 경고 대신 오류를 내십시오 " 입니다. 이 절의 끝에 나열된 특수 조합 모드 중 하나입니다.
전체 SQL 모드 목록
다음 목록은 지원되는 모든 SQL 모드를 설명합니다.
• ALLOW_INVALID_DATES
날짜를 완전히 확인하지 마십시오. 월이 1에서 12 사이의 범위에 있고 일의 범위가 1에서 31 사이인지 확인하십시오. 이는 세 개의 다른 필드에서 년, 월, 일을 얻고 웹 응용 프로그램을 저장하려는 웹 응용 프로그램에 매우 편리합니다 정확히 사용자가 삽입 한 것 (날짜 유효성 검사없이). 이 모드는 DATE 및 DATETIME 열에 적용됩니다. 항상 유효한 날짜가 필요한 TIMESTAMP 열은 적용되지 않습니다.
서버는 월 및 일 값이 합법적이어야하며 단순히 각각 1 - 12 및 1 - 31 범위에 있지 않아야합니다. 엄격 모드를 사용하지 '2004-04-31' 과 같은 잘못된 날짜가 '0000-00-00' 변환되고 경고가 생성됩니다. 엄격 모드를 사용하면 유효하지 않은 날짜가 오류를 생성합니다. 이러한 날짜를 허용하려면 ALLOW_INVALID_DATES .
• ANSI_QUOTES
ANSI_QUOTES 사용하면 리터럴 문자열을 인용 할 때 큰 따옴표를 사용할 수 없으며,이 문자열을 인용 부호로 ANSI_QUOTES 수는 없습니다. 이는 식별자로 해석되기 때문입니다.
• ERROR_FOR_DIVISION_BY_ZERO
ERROR_FOR_DIVISION_BY_ZERO 모드는 MOD( N ,0) 를 포함한 0으로 나누기 처리에 영향을줍니다. 데이터 변경 조작 ( INSERT , UPDATE )의 경우, 그 효과는 엄격한 SQL 모드가 사용 가능한지 여부에 달려 있습니다.
◾ 이 모드가 활성화되어 있지 않으면 0으로 나눠서 NULL 삽입하고 경고를 생성하지 않습니다.
◾ 이 모드를 사용하면 0으로 나누기가 NULL 삽입하고 경고를 생성합니다.
◾ 이 모드와 엄격 모드를 사용하면 IGNORE 를 지정하지 않으면 0으로 IGNORE 오류가 발생합니다. INSERT IGNORE 및 UPDATE IGNORE , 0으로 나눈 값은 NULL 삽입하고 경고를 생성합니다.
SELECT 경우 0으로 나누면 NULL 반환 NULL . ERROR_FOR_DIVISION_BY_ZERO 사용하면 엄격 모드가 활성화되었는지 여부에 관계없이 경고가 생성됩니다.
MySQL 5.7.4 이후, ERROR_FOR_DIVISION_BY_ZERO 는 더 이상 사용되지 않습니다. MySQL 5.7.4에서 5.7.7까지 명시 적으로 이름을 ERROR_FOR_DIVISION_BY_ZERO 때 ERROR_FOR_DIVISION_BY_ZERO 는 아무 일도하지 않습니다. 대신, 그 효과는 엄격한 SQL 모드의 효과에 포함됩니다. MySQL 5.7.8 이상에서는 ERROR_FOR_DIVISION_BY_ZERO 가 명시 적으로 이름을 ERROR_FOR_DIVISION_BY_ZERO 때 효과가 있으며 엄격한 모드의 일부가 아닙니다 (MySQL 5.7.4 이전과 동일). 그러나 엄격 모드와 함께 사용해야하며 기본적으로 사용하도록 설정되어 있습니다. 엄격 모드를 활성화하지 않고 ERROR_FOR_DIVISION_BY_ZERO 를 활성화하거나 그 반대의 경우에도 경고가 발생합니다. 추가적인 설명 은 MySQL 5.7의 SQL 모드 변경을 참조하십시오.
ERROR_FOR_DIVISION_BY_ZERO 는 더 이상 사용되지 않으므로 향후 MySQL 릴리스에서는 별도의 모드 이름으로 제거되며 그 효과는 엄격한 SQL 모드의 효과에 포함됩니다.
• HIGH_NOT_PRECEDENCE
NOT 연산자의 우선 순위는 NOT a BETWEEN b AND c 와 같은 표현식이 NOT a BETWEEN b AND c 구문 분석되도록합니다 NOT (a BETWEEN b AND c) . 일부 이전 버전의 MySQL에서는 표현식이 (NOT a) BETWEEN b AND c 것으로 구문 분석되었습니다. 이전의 높은 우선 순위 동작은 HIGH_NOT_PRECEDENCE SQL 모드를 활성화하여 얻을 수 있습니다.
• IGNORE_SPACE
함수 이름과 ( 문자.) 사이의 공백을 허용하면 내장 함수 이름이 예약어로 취급되므로 결과적으로 함수 이름과 동일한 식별자를 9.2 절. "스키마 객체 이름 " 예를 들어, COUNT() 함수가 있기 때문에 다음 명령문에서 테이블 이름으로 count 를 사용하면 오류가 발생합니다.
테이블 이름은 따옴표로 묶어야합니다.
IGNORE_SPACE SQL 모드는 내장 함수에 적용되며 사용자 정의 함수 나 저장 함수에는 적용되지 않습니다. IGNORE_SPACE 가 사용 가능한지 여부에 관계없이 UDF 또는 저장된 함수 이름 뒤에 공백이 있으면 항상 허용됩니다.
IGNORE_SPACE 대한 더 자세한 설명은 9.2.4 절. "함수 이름 구문 분석 및 해결"을 참조하십시오.
• NO_AUTO_CREATE_USER
인증 정보가 지정되어 있지 않으면 GRANT 문이 자동으로 새 사용자 계정을 작성하지 못하도록합니다 (그렇지 않은 경우). 이 명령문은 IDENTIFIED BY 또는 IDENTIFIED WITH 사용하는 인증 플러그인을 사용하여 비어 있지 않은 암호를 지정해야합니다.
GRANT 아닌 CREATE USER MySQL 계정을 생성하는 것이 바람직합니다. MySQL 5.7.6부터, NO_AUTO_CREATE_USER 는 더 이상 사용되지 않습니다. 5.7.7부터 기본 SQL 모드에는 NO_AUTO_CREATE_USER 포함되며 sql_mode 를 DEFAULT 설정하는 할당을 제외하고 NO_AUTO_CREATE_USER 모드 상태를 변경하는 sql_mode 에 대한 할당이 경고를 생성합니다. NO_AUTO_CREATE_USER 는 향후 MySQL 릴리스에서 제거 될 것이며, 그 시점에서 그 효과는 항상 활성화 될 것입니다 ( GRANT 는 계정을 생성하지 않습니다).
• NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO 는 AUTO_INCREMENT 컬럼 처리에 영향을줍니다. 일반적으로 NULL 또는 0 을 삽입하여 열의 다음 시퀀스 번호를 생성합니다. NO_AUTO_VALUE_ON_ZERO 는이 동작을 0 억제하여 NULL 만 다음 시퀀스 번호를 생성합니다.
이 모드는 테이블의 AUTO_INCREMENT 컬럼에 0 이 저장된 경우 유용 할 수 있습니다. 예를 들어, mysqldump를 사용 하여 테이블을 덤프하고 다시로드하는 경우, MySQL은 일반적으로 0 값을 만날 때 새로운 시퀀스 번호를 생성하여 그 결과와 다른 테이블을 생성합니다 (예 : 0 저장하는 것은 권장되지 않습니다). 버려진 사람. 덤프 파일을 다시로드하기 전에 NO_AUTO_VALUE_ON_ZERO 를 사용 NO_AUTO_VALUE_ON_ZERO 이 문제가 해결됩니다. mysqldump 는 NO_AUTO_VALUE_ON_ZERO 를 가능하게하는 명령문을 출력에 자동으로 포함하여이 문제를 피한다.
• NO_BACKSLASH_ESCAPES
문자열 내에서 백 슬래시 문자 ( \ )를 이스케이프 문자로 사용하지 않습니다. 이 모드를 사용하면 백 슬래시가 다른 것과 마찬가지로 평범한 문자가됩니다.
• NO_DIR_IN_CREATE
테이블을 만들 때 모든 INDEX DIRECTORY 및 DATA DIRECTORY 지시문을 무시하십시오. 이 옵션은 슬레이브 복제 서버에서 유용합니다.
• NO_ENGINE_SUBSTITUTION
CREATE TABLE 또는 ALTER TABLE 과 같은 명령문이 비활성화되거나 컴파일되지 않은 스토리지 엔진을 지정할 때 기본 스토리지 엔진의 자동 대체를 제어합니다.
기본 SQL 모드에는 NO_ENGINE_SUBSTITUTION 포함 NO_ENGINE_SUBSTITUTION .
저장소 엔진은 런타임에 플러그 가능하므로 사용할 수없는 엔진은 동일한 방식으로 처리됩니다.
NO_ENGINE_SUBSTITUTION 비활성화 된 상태에서 CREATE TABLE 대해 기본 엔진이 사용되며 원하는 엔진을 사용할 수없는 경우 경고가 발생합니다. ALTER TABLE 의 경우 경고가 발생하고 테이블은 변경되지 않습니다.
NO_ENGINE_SUBSTITUTION 활성화되면 오류가 발생하고 원하는 엔진을 사용할 수 없으면 테이블이 생성되거나 변경되지 않습니다.
• NO_FIELD_OPTIONS
SHOW CREATE TABLE 의 출력에 MySQL 관련 컬럼 옵션을 출력하지 않는다. 이 모드는 이식성 모드에서 mysqldump 에 의해 사용된다.
• NO_KEY_OPTIONS
SHOW CREATE TABLE 의 출력에 MySQL 관련 인덱스 옵션을 출력하지 마십시오. 이 모드는 이식성 모드에서 mysqldump 에 의해 사용된다.
• NO_TABLE_OPTIONS
SHOW CREATE TABLE 의 출력에 MySQL과 같은 테이블 옵션 (예 : ENGINE )을 인쇄하지 마십시오. 이 모드는 이식성 모드에서 mysqldump 에 의해 사용된다.
• NO_UNSIGNED_SUBTRACTION
UNSIGNED 유형의 정수 값 사이의 뺄셈은 기본적으로 부호없는 결과를 생성합니다. 결과가 부정적 일 경우 오류가 발생합니다.
NO_UNSIGNED_SUBTRACTION SQL 모드가 활성화되면 결과는 음수입니다.
이러한 조작의 결과가 UNSIGNED 정수 열을 갱신하는 데 사용되면, 결과는 열 유형의 최대 값으로 잘 리거나 NO_UNSIGNED_SUBTRACTION 이 사용 가능한 경우 0으로 잘립니다. 엄격한 SQL 모드가 사용 가능하면 오류가 발생하고 열은 변경되지 않습니다.
NO_UNSIGNED_SUBTRACTION 이 활성화 된 경우 피연산자가 서명되지 않은 경우에도 빼기 결과에 서명됩니다. 예를 들어 표 t1 의 열 c2 유형과 표 t1 의 열 c2 유형을 비교하십시오.
이것은 BIGINT UNSIGNED 가 모든 문맥에서 100 % 사용 가능하지 않다는 것을 의미합니다. Section 12.10, "캐스트 함수와 연산자"를 보라.
• NO_ZERO_DATE
NO_ZERO_DATE 모드는 서버가 '0000-00-00' 을 유효한 날짜로 허용하는지 여부에 영향을줍니다. 그 효과는 엄격한 SQL 모드가 사용 가능한지에 따라 다릅니다.
◾ 이 모드를 사용하지 않으면 '0000-00-00' 이 허용되고 삽입하면 경고가 표시되지 않습니다.
◾ 이 모드를 사용하면 '0000-00-00' 이 허용되고 삽입하면 경고가 표시됩니다.
◾ 이 모드와 스트릭 트 모드가 활성화되면 '0000-00-00' 은 허용되지 않으며 IGNORE 가 주어지지 않는 한 삽입은 에러를 발생시킵니다. INSERT IGNORE 와 UPDATE IGNORE 경우 '0000-00-00' 이 허용되고 삽입은 경고를 생성합니다.
MySQL 5.7.4부터는 NO_ZERO_DATE 가 사용되지 않습니다. MySQL 5.7.4에서 5.7.7까지 명시 적으로 이름을 NO_ZERO_DATE 때 NO_ZERO_DATE 는 아무 것도하지 않습니다. 대신, 그 효과는 엄격한 SQL 모드의 효과에 포함됩니다. MySQL 5.7.8 및 그 이후 버전에서 NO_ZERO_DATE 는 명시 적으로 이름을 NO_ZERO_DATE 때 효과가 있으며 MySQL 5.7.4 이전처럼 엄격 모드의 일부가 아닙니다. 그러나 엄격 모드와 함께 사용해야하며 기본적으로 사용하도록 설정되어 있습니다. 엄격 모드를 활성화하지 않고 NO_ZERO_DATE 를 활성화하거나 그 반대의 경우에도 경고가 발생합니다. 추가적인 설명 은 MySQL 5.7의 SQL 모드 변경을 참조하십시오.
NO_ZERO_DATE 는 향후 제공되지 않을 예정이므로 향후 MySQL 릴리스에서는 별도의 모드 이름으로 제거되며 그 영향은 엄격한 SQL 모드의 효과에 포함됩니다.
• NO_ZERO_IN_DATE
NO_ZERO_IN_DATE 모드는 서버가 연도 부분이 0이 아니지만 월 또는 일 부분이 0 인 날짜를 허용하는지 여부에 영향을줍니다 (이 모드는 '2010-00-01' 또는 '2010-01-00' 과 같은 날짜에 영향을 미치지 만 '0000-00-00' 서버가 '0000-00-00' 허용하는지 여부를 제어하려면 NO_ZERO_DATE 모드를 사용하십시오.) NO_ZERO_IN_DATE 의 영향은 엄격한 SQL 모드의 사용 가능 여부에 따라 달라집니다.
◾ 이 모드를 사용하지 않으면 부품 수가 0 인 날짜가 허용되고 삽입하면 경고가 표시되지 않습니다.
◾ 이 모드를 사용하면 날짜가 0 인 날짜가 '0000-00-00' 삽입되고 경고가 표시됩니다.
◾ 이 모드와 엄격 모드를 사용하면 IGNORE 가 주어지지 않는 한, 부품 수가 0 인 날짜는 허용되지 않으며 삽입하면 오류가 발생합니다. INSERT IGNORE 와 UPDATE IGNORE , 파트가 0 인 날짜는 '0000-00-00' 삽입되고 경고가 생성됩니다.
MySQL 5.7.4부터는 NO_ZERO_IN_DATE 가 사용되지 않습니다. MySQL 5.7.4에서 5.7.7까지 NO_ZERO_IN_DATE 는 명시 적으로 이름을 NO_ZERO_IN_DATE 때 아무 것도하지 않습니다. 대신, 그 효과는 엄격한 SQL 모드의 효과에 포함됩니다. MySQL 5.7.8 및 그 이후 버전에서, NO_ZERO_IN_DATE 는 명시 적으로 명명되었을 때 효과가 있으며, MySQL 5.7.4 이전처럼 엄격 모드의 일부가 아닙니다. 그러나 엄격 모드와 함께 사용해야하며 기본적으로 사용하도록 설정되어 있습니다. 엄격 모드를 활성화하지 않고 NO_ZERO_IN_DATE 를 활성화하거나 그 반대의 경우에도 경고가 발생합니다. 추가적인 설명 은 MySQL 5.7의 SQL 모드 변경을 참조하십시오.
NO_ZERO_IN_DATE 는 향후 제공되지 않을 예정이므로 향후 MySQL 릴리스에서는 별도의 모드 이름으로 제거되며 그 영향은 엄격한 SQL 모드의 효과에 포함됩니다.
• onLY_FULL_GROUP_BY
선택 목록, HAVING 조건 또는 ORDER BY 목록이 GROUP BY 절에 이름도 지정되지 않았거나 기능적으로 GROUP BY 열에 의해 고유하게 결정된 비 집합 열을 참조하는 쿼리를 거부합니다.
MySQL 5.7.5부터 기본 SQL 모드에는 onLY_FULL_GROUP_BY 포함됩니다. (5.7.5 이전 버전에서는 MySQL이 기능 의존성을 감지하지 못했고 onLY_FULL_GROUP_BY 는 기본적으로 활성화되어 있지 않습니다. 5.7.5 이전 버전 동작에 대한 설명은 MySQL 5.6 Reference Manual을 참조 하십시오.)
표준 SQL에 대한 MySQL 확장은 HAVING 절의 참조를 선택 목록의 별명이 지정된 표현식으로 허용합니다. MySQL 5.7.5 이전 버전에서는 onLY_FULL_GROUP_BY 사용하면이 확장을 사용할 수 없으므로 별표없는 표현식을 사용하여 HAVING 절을 작성해야합니다. MySQL 5.7.5부터는 HAVING 절이 onLY_FULL_GROUP_BY 가 활성화되었는지 여부에 관계없이 별칭을 참조 할 수 있도록이 제한이 해제되었습니다.
추가적인 토론과 예제는 12.19.3 절 . "GROUP BY의 MySQL 처리"부분을보십시오 .
• PAD_CHAR_TO_FULL_LENGTH
기본적으로 후미 공백은 검색시 CHAR 열 값에서 잘립니다. PAD_CHAR_TO_FULL_LENGTH 가 활성화되면 트리밍이 발생하지 않고 검색된 CHAR 값은 전체 길이로 패딩됩니다. 이 모드는 후행 공백이 검색시 유지되는 VARCHAR 열에는 적용되지 않습니다.
• PIPES_AS_CONCAT
치료 || OR 의 동의어가 아닌 CONCAT() 과 같은 문자열 연결 연산자로 사용됩니다.
• REAL_AS_FLOAT
REAL 을 FLOAT 의 동의어로 취급하십시오. 기본적으로 MySQL은 REAL 을 DOUBLE 의 동의어로 취급합니다.
• STRICT_ALL_TABLES
모든 저장소 엔진에 대해 엄격한 SQL 모드를 사용합니다. 유효하지 않은 데이터 값은 거부됩니다. 자세한 내용은 Strict SQL Mode를 참조하십시오.
MySQL 5.7.4에서 5.7.7까지 STRICT_ALL_TABLES 는 ERROR_FOR_DIVISION_BY_ZERO , NO_ZERO_DATE 및 NO_ZERO_IN_DATE 모드의 효과를 포함합니다. 추가적인 설명 은 MySQL 5.7의 SQL 모드 변경을 참조하십시오.
• STRICT_TRANS_TABLES
트랜잭션 저장 엔진 및 가능한 경우 비 트랜잭션 저장 엔진에 엄격한 SQL 모드를 사용합니다. 자세한 내용은 Strict SQL Mode를 참조하십시오.
MySQL 5.7.4에서 5.7.7까지 STRICT_TRANS_TABLES 는 ERROR_FOR_DIVISION_BY_ZERO , NO_ZERO_DATE 및 NO_ZERO_IN_DATE 모드의 효과를 포함합니다. 추가적인 설명 은 MySQL 5.7의 SQL 모드 변경을 참조하십시오.