[MySQL] Server SQL Modes

MySQL 서버는 다른 SQL 모드에서 작동 있으며 sql_mode 시스템 변수의 값에 따라이 모드를 다른 클라이언트에 다르게 적용 있습니다. DBA 사이트 서버 운영 요구 사항과 일치하도록 전역 SQL 모드를 설정할 있으며 응용 프로그램은 세션 SQL 모드를 자체 요구 사항으로 설정할 있습니다.

 

모드는 MySQL 지원하는 SQL 구문과 수행하는 데이터 유효성 검사에 영향을줍니다. 따라서 다른 환경에서 MySQL을보다 쉽게 ​​사용하고 다른 데이터베이스 서버와 함께 MySQL 사용할 있습니다.

+ SQL 모드 설정

+ 가장 중요한 SQL 모드

+ SQL 모드의 전체 목록

+ 조합 SQL 모드

+ 엄격한 SQL 모드

+ IGNORE 키워드와 엄격한 SQL 모드의 비교

+ MySQL 5.7 SQL 모드 변경

 

InnoDB 테이블로 작업 때는 innodb_strict_mode 시스템 변수도 고려하십시오. InnoDB 테이블에 대한 추가 오류 검사를 활성화합니다.

 

■ SQL 모드 설정

MySQL 5.7 기본 SQL 모드에는 ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION 모드가 포함됩니다.

 

모드는 MySQL 5.7 기본 SQL 모드에 추가되었습니다. ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES 모드는 MySQL 5.7.5에서 추가되었습니다. NO_AUTO_CREATE_USER 모드는 MySQL 5.7.7에서 추가되었습니다. ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 모드는 MySQL 5.7.8에서 추가되었습니다. 기본 SQL 모드 값에 대한 이러한 변경 사항에 대한 자세한 내용은 MySQL 5.7 SQL 모드 변경 사항을 참조합니다.

 

서버 시작시 SQL 모드를 설정하려면 명령 행에서 --sql-mode = "modes"옵션 또는 my.cnf (Unix operating systems) 또는 my 같은 옵션 파일에서 sql-mode = "modes" 사용하십시오. .ini (Windows). modes 쉼표로 구분 다른 모드 목록입니다. SQL 모드를 명시 적으로 지우려면 명령 행에서 --sql-mode = "" 사용하거나 옵션 파일에서 sql-mode = "" 사용하여 문자열로 설정합니다.

 

참고사항

MySQL 설치 프로그램은 설치 과정에서 SQL 모드를 구성 있습니다. SQL 모드가 기본값 또는 예상과 다르면 시작시 서버가 읽는 옵션 파일의 설정을 확인해야 합니다.

 

런타임시 SQL 모드를 변경하려면 SET 문을 사용하여 글로벌 또는 세션 sql_mode 시스템 변수를 설정합니다.

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';

GLOBAL 변수를 설정하려면 SUPER 권한이 필요하며 해당 시점부터 연결되는 모든 클라이언트의 작동에 영향을줍니다. SESSION 변수를 설정하면 현재 클라이언트에만 영향을줍니다. 클라이언트는 언제든지 세션 sql_mode 값을 변경할 있습니다.

 

현재 글로벌 또는 세션 sql_mode 설정을 판별하려면 해당 값을 선택합니다.

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

 

중요사항

SQL 모드 사용자 정의 파티션. 파티션 테이블에 데이터를 작성하고 삽입 서버 SQL 모드를 변경하면 해당 테이블의 동작이 크게 변경되어 데이터가 손실되거나 손상 있습니다. 사용자 정의 분할을 사용하는 테이블을 만든 후에는 SQL 모드를 변경하지 않는 것이 좋습니다.

 

파티션 테이블을 복제 마스터 슬레이브에서 다른 SQL 모드도 문제를 일으킬 있습니다. 최상의 결과를 얻으려면 항상 마스터 슬레이브에서 동일한 서버 SQL 모드를 사용해야합니다.

 

가장 중요한 SQL 모드

가장 중요한 sql_mode 값은 다음과 같습니다.

 

+ ANSI

모드는 구문과 동작을 변경하여 표준 SQL 가깝게 맞춥니다. 섹션의 끝에 나열된 특수 조합 모드 하나입니다.

 

+ STRICT_TRANS_TABLES

트랜잭션 테이블에 지정된대로 값을 삽입 없으면 명령문을 중단하십시오. 트랜잭션 테이블의 경우, 값이 단일 명령문 또는 다중 명령문의 번째 행에서 발생하면 명령문을 중단하십시오. 자세한 내용은이 섹션의 뒷부분에 나와 있습니다.

 

MySQL 5.7.5부터 기본 SQL 모드에는 STRICT_TRANS_TABLES 포함됩니다.

 

+ TRADITIONAL

MySQL "전통적인"SQL 데이터베이스 시스템처럼 작동 시킵니다. 모드에 대한 간단한 설명은 컬럼에 잘못된 값을 삽입할 "경고 대신 오류를 제공" 입니다. 섹션의 끝에 나열된 특수 조합 모드 하나입니다.

 

참고사항

TRADITIONAL 모드를 사용하면 오류가 발생하자마자 INSERT 또는 UPDATE 중단됩니다. 트랜잭션 스토리지 엔진을 사용하는 경우, 오류 이전에 작성된 데이터 변경 사항이 롤백되지 않아 "부분적으로 완료된"업데이트로 인해 이것이 원하는 것이 아닐 있습니다.

 

매뉴얼에서 "엄격 모드" 언급하는 경우 STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 하나 또는 다를 사용하는 모드를 의미합니다.

 

 

■ SQL 모드의 전체 목록

다음 목록은 지원되는 모든 SQL 모드를 설명합니다.

 

+ ALLOW_INVALID_DATES

날짜에 대한 전체 확인을 수행하지 않습니다. 월이 1에서 12 사이의 범위이고 하루가 1에서 31 사이의 범위인지만 확인합니다. 기능은 개의 다른 필드에서 연도, 날짜를 얻고 날짜 유효성 검사 없이 사용자가 삽입한 내용을 정확하게 저장하는 응용 프로그램에 유용할 있습니다. 모드는 DATE DATETIME 열에 적용됩니다. 항상 유효한 날짜가 필요한 TIMESTAMP 컬럼은 적용되지 않습니다.

 

ALLOW_INVALID_DATES 사용하지 않으면 서버는 해당 값이 각각 1-12 1-31 범위가 아닌 유효한 값을 요구합니다. 엄격 모드를 사용하지 않으면 '2004-04-31' 같은 유효하지 않은 날짜가 '0000-00-00'으로 변환되고 경고가 생성됩니다. 엄격 모드를 사용하면 유효하지 않은 날짜가 오류를 생성합니다. 그러한 날짜를 허용하려면 ALLOW_INVALID_DATES 활성화합니다.

 

+ ANSI_QUOTES

"(쌍따옴표) 문자열 인용 문자가 아닌 식별자 인용 문자 ( : 인용 문자) 취급합니다. 모드가 활성화된 상태에서도 계속`(quote character) 사용하여 식별자를 인용 있습니다. 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으로 나누면 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 0으로 나누면 NULL 삽입되고 경고가 생성됩니다.

SELECT 경우 0으로 나누면 NULL 반환됩니다. ERROR_FOR_DIVISION_BY_ZERO 활성화하면 엄격 모드 사용 여부에 관계없이 경고도 생성됩니다.

 

ERROR_FOR_DIVISION_BY_ZERO 이상 사용되지 않습니다. ERROR_FOR_DIVISION_BY_ZERO 엄격 모드의 일부는 아니지만 엄격 모드와 함께 사용해야하며 기본적으로 활성화되어 있습니다. 엄격 모드를 활성화하지 않고 ERROR_FOR_DIVISION_BY_ZERO 활성화하면 경고가 발생합니다.

 

ERROR_FOR_DIVISION_BY_ZERO 이상 사용되지 않으므로 향후 MySQL 릴리스에서 별도의 모드 이름으로 적용되며 효과는 엄격한 SQL 모드의 효과에 포함됩니다.

 

+ HIGH_NOT_PRECEDENCE

NOT 연산자의 우선 순위는 NOT BETWEEN b AND c 같은 표현식이 NOT (a BETWEEN b AND c)으로 구문 분석되는 것입니다. 일부 이전 버전의 MySQL에서는이 표현식을 b c 사이의 (아직 아님)으로 구문 분석했습니다. HIGH_NOT_PRECEDENCE SQL 모드를 사용하면 이전의 높은 우선 순위의 동작을 얻을 있습니다.

mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 0
mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
        -> 1

 

+ IGNORE_SPACE

함수 이름과 (문자 사이에 공백을 허용하면 내장 함수 이름이 예약어로 취급됩니다. 결과적으로 함수 이름과 동일한 식별자는 9.2 스키마 객체 이름 설명 된대로 인용해야합니다. 예를 들어, COUNT() 함수가 있으므로 다음 명령문에서 count 테이블 이름으로 사용하면 오류가 발생합니다.

mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax

 

테이블 이름은 따옴표로 묶어야합니다.

mysql> CREATE TABLE `count` (i INT);
Query OK, 0 rows affected (0.00 sec)

 

IGNORE_SPACE SQL 모드는 사용자 정의 함수 저장 함수가 아닌 내장 함수에 적용됩니다. IGNORE_SPACE 사용 가능 여부에 관계없이 UDF 또는 저장된 함수 이름 뒤에 공백을 두는 것이 항상 허용됩니다.

 

+ NO_AUTO_CREATE_USER

인증 정보가 지정되지 않은 경우 GRANT문이 자동으로 사용자 계정을 작성하지 않으면 새로 작성하지 못하게 해야 합니다. 명령문은 IDENTIFIED BY 사용하거나 비어 있지 않은 비밀번호를 지정하거나 IDENTIFIED WITH 사용하는 인증 플러그인을 지정해야 합니다.

 

GRANT대신 CREATE USER 사용하여 MySQL계정을 작성하는 것이 좋습니다. NO_AUTO_CREATE_USER 더이상 사용되지 않으며 기본 SQL 모드에는 NO_AUTO_CREATE_USER 포함됩니다. NO_AUTO_CREATE_USER 모드 상태를 변경하는 sql_mode 지정하면 sql_mode DEFAULT 설정한 지정을 제외하고 경고가 생성됩니다. NO_AUTO_CREATE_USER 향후 MySQL 릴리스에서 제거 예정이며이 시점에서 효과는 항상 활성화됩니다(GRANT 계정을 만들지 않습니다).

 

이전에는 NO_AUTO_CREATE_USER 사용되지 않기전에 이를 사용하지 않는 한가지 이유는 안전 복제가 아니기 때문입니다. 이제 CREATE USER IF NOT EXISTS, DROP USER IF EXISTS ALANT USER IF EXISTS 사용하여 활성화 복제 안전 사용자 관리를 수행할 있습니다. 명령문은 슬레이브와 마스터의 권한이 다른 경우 안전한 복제를 가능하게합니다.

 

+ NO_AUTO_VALUE_ON_ZERO

NO_AUTO_VALUE_ON_ZERO AUTO_INCREMENT컬럼 처리에 영향을 줍니다. 일반적으로 컬럼에 NULL 또는 0 삽입하여 컬럼의 다음 시퀀스 번호를 생성합니다. NO_AUTO_VALUE_ON_ZERO 0 대해이 동작을 억제하므로 NULL 다음 시퀀스 번호를 생성합니다.

 

모드는 0 테이블의 AUTO_INCREMENT 컬럼에 저장된 경우 유용할 있습니다. (0 저장하는 것은 권장되지 않습니다.)예를 들어 Mysqldump 테이블을 덤프한 다음 다시 로드하는 경우 MySQL 일반적으로 0값에 도달하면 시퀀스 번호를 생성하므로 덤프된 테이블과 컨텐츠가 다른 테이블이 생성됩니다. 덤프 파일을 다시로드하기 전에 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 같은 명령문이 비활성화되었거나 컴파일되지 않은 스토리지 엔진을 지정할 기본 스토리지 엔진의 자동 대체를 제어힙ㄴ;/

기본적으로 NO_ENGINE_SUBSTITUTION 사용됩니다.

런타임시 스토리지 엔진을 플러그할 있으므로 사용할 없는 엔진은 동일한 방식으로 처리됩니다.

NO_ENGINE_SUBSTITUTION 비활성화하면 CREATE TABLE 기본 엔진이 사용되며 원하는 엔진을 사용할 수없는 경우 경고가 발생합니다. ALTER TABLE 경우 경고가 발생하고 테이블이 변경되지 않습니다.

NO_ENGINE_SUBSTITUTION 사용하면 원하는 엔진을 사용할 없는 경우 오류가 발생하고 테이블이 작성되거나 변경되지 않습니다.

 

+ NO_FIELD_OPTIONS

SHOW CREATE TABLE 출력에서 ​​MySQL 특정 옵션을 인쇄하지 않습니다. 모드는 이식성 모드에서 mysqldump 의해 사용됩니다.

 

참고사항

MySQL 5.7.22부터 NO_FIELD_OPTIONS 이상 사용되지 않습니다. 향후 버전의 MySQL에서는 제거 예정입니다.

 

+ NO_KEY_OPTIONS

SHOW CREATE TABLE 출력에서 ​​MySQL 특정 인덱스 옵션을 인쇄하지 않습니다. 모드는 이식성 모드에서 mysqldump 의해 사용됩니다.

 

참고사항

MySQL 5.7.22부터 NO_KEY_OPTIONS 이상 사용되지 않습니다. 향후 버전의 MySQL에서는 제거 예정입니다.

 

+ NO_TABLE_OPTIONS

SHOW CREATE TABLE 출력에 MySQL 특정 테이블 옵션( : ENGINE) 출력하지 않습니다. 모드는 이식성 모드에서 mysqldump 의해 사용됩니다.

 

노트

MySQL 5.7.22부터 NO_TABLE_OPTIONS 이상 사용되지 않습니다. 향후 버전의 MySQL에서는 제거 예정입니다.

 

+ NO_UNSIGNED_SUBTRACTION

UNSIGNED 유형의 정수 값을 빼면 기본적으로 부호없는 결과가 생성됩니다. 그렇지 않으면 결과가 음수이면 오류가 발생합니다.

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

 

NO_UNSIGNED_SUBTRACTION SQL 모드가 사용 가능한 경우 결과는 음수입니다.

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+

이러한 연산 결과를 사용하여 UNSIGNED 정수 컬럼을 업데이트하는 경우 결과는 컬럼유형의 최대 값으로 클리핑되거나 NO_UNSIGNED_SUBTRACTION 활성화된 경우 0으로 클리핑됩니다. 엄격한 SQL 모드를 사용하면 오류가 발생하고 컬럼은 변경되지 않습니다.

 

NO_UNSIGNED_SUBTRACTION 사용하면 피연산자가 부호가 없더라도 빼기 결과에 부호가 있습니다. 예를 들어, 테이블 t1 c2 유형과 테이블 t2 c2 유형을 비교해 봅니다.

mysql> SET sql_mode='';
mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
mysql> DESCRIBE t1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| c2    | bigint(21) unsigned | NO   |     | 0       |       |
+-------+---------------------+------+-----+---------+-------+

mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
mysql> DESCRIBE t2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c2    | bigint(21) | NO   |     | 0       |       |
+-------+------------+------+-----+---------+-------+

, BIGINT UNSIGNED 모든 상황에서 100% 사용할 수있는 것은 아닙니다.

 

+ NO_ZERO_DATE

NO_ZERO_DATE 모드는 서버가 '0000-00-00' 유효한 날짜로 허용하는지 여부에 영향을줍니다. 효과는 또한 엄격한 SQL 모드 사용 여부에 따라 다릅니다.

- 모드를 사용하지 않으면 '0000-00-00' 허용되며 인서트는 경고를 생성하지 않습니다.

- 모드가 활성화되면 '0000-00-00' 허용되며 삽입시 경고가 표시됩니다.

- 모드와 엄격 모드가 활성화 경우 IGNORE 지정하지 않으면 '0000-00-00' 허용되지 않고 인서트에서 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 '0000-00-00' 허용되며 삽입시 경고가 발생합니다.

 

NO_ZERO_DATE 이상 사용되지 않습니다. NO_ZERO_DATE 엄격 모드의 일부는 아니지만 엄격 모드와 함께 사용해야하며 기본적으로 활성화되어 있습니다. 엄격 모드를 사용하지 않고 NO_ZERO_DATE 사용하거나 사용하지 않으면 경고가 발생합니다.

 

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 날짜가 허용되며 삽입은 경고를 생성하지 않습니다.

- 모드를 활성화하면 부품이없는 날짜가 '0000-00-00'으로 삽입되고 경고가 표시됩니다.

- 모드 엄격 모드가 활성화 경우 IGNORE 제공되지 않는 부분이 0 날짜는 허용되지 않으며 삽입시 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 파트가 0 날짜는 '0000-00-00'으로 삽입되고 경고가 발생합니다.

 

NO_ZERO_IN_DATE 이상 사용되지 않습니다. NO_ZERO_IN_DATE 엄격 모드의 일부는 아니지만 엄격모드와 함께 사용해야하며 기본적으로 활성화되어 있습니다. 엄격 모드를 사용하지 않고 NO_ZERO_IN_DATE 사용하거나 사용하지 않으면 경고가 발생합니다.

 

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 기본적으로 활성화되어 있지 않습니다.)

 

표준 SQL 대한 MySQL 확장은 HAVING 절의 참조가 선택 목록의 별명 표현식에 대한 참조를 허용합니다. MySQL 5.7.5 이전에는 ONLY_FULL_GROUP_BY 활성화하면이 확장이 비활성화되므로 HAVING 절을 앨리어싱되지 않은 식을 사용하여 작성해야합니다. MySQL 5.7.5에서이 제한은 해제되어 HAVING 절이 ONLY_FULL_GROUP_BY 활성화 여부에 관계없이 별칭을 참조 있습니다.

 

+ PAD_CHAR_TO_FULL_LENGTH

기본적으로 후미 공백은 검색시 CHAR컬럼 값에서 잘립니다. PAD_CHAR_TO_FULL_LENGTH 사용 가능한 경우 트리밍이 발생하지 않고 검색된 CHAR 값이 전체 길이로 채워집니다. 모드는 VARCHAR 열에는 적용되지 않으며, 검색시 후행 공백이 유지됩니다.

mysql> CREATE TABLE t1 (c1 CHAR(10));
Query OK, 0 rows affected (0.37 sec)

mysql> INSERT INTO t1 (c1) VALUES('xy');
Query OK, 1 row affected (0.01 sec)

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------+-----------------+
| c1   | CHAR_LENGTH(c1) |
+------+-----------------+
| xy   |               2 |
+------+-----------------+
1 row in set (0.00 sec)

mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
+------------+-----------------+
| c1         | CHAR_LENGTH(c1) |
+------------+-----------------+
| xy         |              10 |
+------------+-----------------+
1 row in set (0.00 sec)

 

+ PIPES_AS_CONCAT

치료 || OR 동의어가 아닌 문자열 연결 연산자 (CONCAT () 동일)

OR 동의어가 아닌 문자열 연결 연산자(CONCAT() 동일) 처리합니다.(||)

 

+ REAL_AS_FLOAT

REAL FLOAT 동의어로 취급합니다. 기본적으로 MySQL REAL DOUBLE 동의어로 취급합니다.

 

+ STRICT_ALL_TABLES

모든 스토리지 엔진에 대해 엄격한 SQL 모드를 사용합니다. 유효하지 않은 데이터 값이 거부되었습니다. 자세한 내용은 엄격한 SQL 모드를 참조합니다.

MySQL 5.7.4부터 5.7.7까지 STRICT_ALL_TABLES에는 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 모드의 효과가 포함됩니다.

 

+ STRICT_TRANS_TABLES

트랜잭션 스토리지 엔진에 대해 그리고 가능한 경우 트랜잭션 스토리지 엔진에 대해 엄격한 SQL 모드를 사용하십시오. 자세한 내용은 엄격한 SQL 모드를 참조합니다.

MySQL 5.7.4부터 5.7.7까지 STRICT_TRANS_TABLES에는 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 모드의 효과가 포함됩니다.

 

■ SQL Modes 조합

다음 특수 모드는 이전 목록의 모드 조합을위한 약자로 제공됩니다.

+ ANSI

REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE (MySQL 5.7.5 현재) ONLY_FULL_GROUP_BY 같습니다.

 

ANSI 모드는 또한 외부 참조가 해결된 외부 쿼리에서 외부 참조 S(outer_ref) 있는 집합 함수 S 집계할 없는 쿼리에 대해 서버가 오류를 반환하도록합니다. 이것은 그런 쿼리입니다.

mysql> SELECT * FROM t1 WHERE t1.a IN (SELECT MAX(t1.b) FROM t2 WHERE ...);

여기서 MAX (t1.b) 해당 쿼리의 WHERE 절에 나타나므로 외부 쿼리에서 집계 없습니다. 상황에서는 표준 SQL 오류가 필요합니다. ANSI 모드를 사용하지 않으면 서버는 S(const) 해석하는 것과 같은 방식으로 이러한 쿼리에서 S(outer_ref) 처리합니다.

 

+ DB2

PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 동일합니다.

 

+ MAXDB

PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER 같습니다.

 

+ MSSQL

PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 동일합니다.

 

+ MYSQL323

MYSQL323, HIGH_NOT_PRECEDENCE 동일합니다. 이것은 HIGH_NOT_PRECEDENCE MYSQL323 특정한 SHOW CREATE TABLE 동작을 의미합니다.

 

- TIMESTAMP 표시에는 DEFAULT 또는 ON UPDATE 속성이 포함되지 않습니다.

- 문자열 표시에는 문자 세트 데이터 정렬 속성이 포함되지 않습니다. CHAR VARCHAR컬럼의 경우 데이터 정렬이 이진이면 BINARY 컬럼 유형에 추가됩니다.

- ENGINE = engine_name 테이블 옵션은 TYPE = engine_name으로 표시됩니다.

- MEMORY 테이블의 경우 스토리지 엔진이 HEAP 표시됩니다.

 

+ MYSQL40

MYSQL40, HIGH_NOT_PRECEDENCE 동일합니다. 이는 HIGH_NOT_PRECEDENCE MYSQL40 특정한 동작을 의미합니다. SHOW CREATE TABLE HEAP MEMORY 테이블의 스토리지 엔진으로 표시하지 않는다는 점을 제외하면 MYSQL323 동일합니다.

 

+ 오라클

PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER 같습니다.

 

+ POSTGRESQL

PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 동일합니다.

 

+ TRADITIONAL

MySQL 5.7.4 이전 MySQL 5.7.8 이상에서 TRADITIONAL STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITU 동일합니다.

 

MySQL 5.7.4부터 5.7.7까지 TRADITIONAL STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION 같습니다. NO_ZERO_IN_DATE, NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO 모드는 해당 버전에서 효과가 엄격한 SQL 모드 (STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES) 효과에 포함되므로 이름이 지정되지 않습니다. 따라서 TRADITIONAL 효과는 모든 MySQL 5.7 버전에서 동일하며 MySQL 5.6 동일합니다.

 

■ Strict SQL 모드(엄격모드)

엄격 모드는 MySQL INSERT 또는 UPDATE 같은 데이터 변경 명령문에서 유효하지 않거나 누락 값을 처리하는 방법을 제어합니다. 여러 가지 이유로 값이 유효하지 않을 있습니다. 예를 들어, 컬럼의 데이터 유형이 잘못되었거나 범위를 벗어 났을 있습니다. 삽입 행에 정의에 명시 DEFAULT 절이없는 NULL 아닌 컬럼의 값이 없으면 값이 누락됩니다. NULL 열의 경우 값이 누락되면 NULL 삽입됩니다. 엄격한 모드는 CREATE TABLE 같은 DDL 문에도 영향을줍니다.

 

엄격 모드가 유효하지 않은 경우, MySQL 유효하지 않거나 누락 값에 대해 조정 값을 삽입하고 경고를 생성합니다 (13.7.5.40 “SHOW WARNINGS 명령문참조). 엄격 모드에서는 INSERT IGNORE 또는 UPDATE IGNORE 사용하여이 동작을 생성할 있습니다.

 

데이터를 변경하지 않는 SELECT 같은 명령문의 경우 유효하지 않은 값은 오류가 아닌 엄격 모드에서 경고를 생성합니다.

 

엄격 모드는 최대키 길이를 초과하는 키를 만들려고하면 오류가 발생합니다. 엄격 모드를 사용하지 않으면 키가 최대 길이로 경고되고 잘립니다.

 

엄격 모드는 외래 제약 조건의 검사 여부에 영향을 미치지 않습니다. foreign_key_checks 사용할 있습니다. (5.1.7 서버 시스템 변수참조)

 

STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES 사용하는 경우 엄격한 SQL 모드가 적용되지만 이러한 모드의 효과는 약간 다릅니다.

+ 트랜잭션 테이블의 경우 STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES 사용 가능한 경우 데이터 변경 명령문에서 유효하지 않거나 누락된 값에 대해 오류가 발생합니다. 명령문이 중단되고 롤백됩니다.

+ 트랜잭션 테이블의 경우 삽입하거나 업데이트 번째 행에서 잘못된 값이 발생하면 모드에서 동작이 동일합니다. 명령문이 중단되고 테이블은 변경되지 않습니다. 명령문이 여러 행을 삽입하거나 수정하고 번째 이후 행에서 잘못된 값이 발생하면 결과는 사용되는 엄격 모드에 따라 다릅니다.

- STRICT_ALL_TABLES 경우 MySQL 오류를 반환하고 나머지 행은 무시합니다. 그러나 이전 행이 삽입되거나 업데이트되었으므로 결과는 부분 업데이트입니다. 이를 피하려면 테이블을 변경하지 않고 중단할 있는 단일 명령문을 사용합니다.

- STRICT_TRANS_TABLES 경우 MySQL 유효하지 않은 값을 컬럼에 가장 가까운 유효 값으로 변환하고 조정 값을 삽입합니다. 값이 없으면 MySQL 데이터 형식에 대한 암시 기본값을 삽입합니다. 경우 모두 MySQL 오류가 아니라 경고를 생성하고 명령문 처리를 계속합니다.

 

 

엄격 모드는 다음과 같이 0, 0 날짜 날짜 0으로 나누기 처리에 영향을 미칩니다.

+ 엄격 모드는 0으로 나누기 처리에 영향을 미치며 MOD (N, 0) 포함합니다.

  데이터 변경 작업 (INSERT, UPDATE) :

  - 엄격 모드를 사용하지 않으면 0으로 나누면 NULL 삽입되고 경고가 생성되지 않습니다.

  - 엄격 모드가 활성화 경우 IGNORE 제공되지 않는 0으로 나누면 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 0으로 나누면 NULL 삽입되고 경고가 생성됩니다.

  SELECT 경우 0으로 나누면 NULL 반환됩니다. 엄격 모드를 사용하면 경고가 생성됩니다.

 

+ 엄격 모드는 서버가 '0000-00-00' 유효한 날짜로 허용하는지 여부에 영향을 미칩니다.

- 엄격 모드를 사용하지 않으면 '0000-00-00' 허용되며 인서트는 경고를 생성하지 않습니다.

- 엄격 모드가 활성화된 경우 IGNORE 지정하지 않으면 '0000-00-00' 허용되지 않으며 삽입시 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 '0000-00-00' 허용되며 삽입시 경고가 발생합니다.

 

+ 엄격 모드는 서버에서 연도 부분이 0 아닌 또는 부분이 0 날짜 ( '2010-00-01'또는 '2010-01-00' 같은 날짜) 허용하는지 여부에 영향을 미칩니다.

- 엄격 모드를 사용하지 않으면 파트가 0 날짜가 허용되며 삽입은 경고를 생성하지 않습니다.

- 엄격 모드가 활성화 경우 IGNORE 제공되지 않으면 부품이없는 날짜는 허용되지 않으며 삽입시 오류가 발생합니다. INSERT IGNORE UPDATE IGNORE 경우 파트가 0 날짜는 '0000-00-00'(IGNORE 유효한 것으로 간주 )으로 삽입되고 경고를 생성합니다.

 

MySQL 5.7.4 이전 MySQL 5.7.8 이상에서 엄격 모드는 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 모드와 함께 0, 0 날짜 0으로 날짜를 나누는 처리에 영향을줍니다. MySQL 5.7.4부터 5.7.7까지, ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 모드는 명시 적으로 명명 경우 아무 것도 수행하지 않으며 효과는 엄격 모드의 효과에 포함됩니다.

 

 

 

■ IGNORE 키워드와 엄격한 SQL 모드의 비교

섹션에서는 IGNORE 키워드 (오류를 경고로 다운 그레이드) 엄격한 SQL 모드 (경고를 오류로 업그레이드) 명령문 실행에 대한 영향을 비교합니다. 영향을 미치는 문장과 적용되는 오류에 대해 설명합니다.

 

다음 표는 기본값이 오류 경고를 생성 명령문 동작을 요약 것입니다. 기본값이 오류를 생성하는 경우의 예는 NOT NULL 열에 NULL 삽입하는 것입니다. 기본값이 경고를 생성하는 경우의 예는 잘못된 데이터 유형의 값을 열에 삽입하는 것입니다( : 문자열 'abc' 정수 열에 삽입하는 ).

 

Operational Mode

When Statement Default is Error

When Statement Default is Warning

Without IGNORE or strict SQL mode

Error

Warning

With IGNORE

Warning

Warning (same as without IGNORE or strict SQL mode)

With strict SQL mode

Error (same as without IGNORE or strict SQL mode)

Error

With IGNORE and strict SQL mode

Warning

Warning

 

테이블에서 도출할 가지 결론은 IGNORE 키워드와 엄격한 SQL 모드가 모두 유효 IGNORE 우선한다는 것입니다. , IGNORE strict SQL 모드는 오류 처리에 반대 효과가있는 것으로 간주 있지만 함께 사용할 취소되지 않습니다.

 

▶︎ 명령문 실행에 대한 IGNORE 영향

MySQL 여러 문장은 선택적 IGNORE 키워드를 지원합니다. 키워드는 서버가 특정 유형의 오류를 다운 그레이드하고 대신 경고를 생성하게합니다. 다중 명령문의 경우 IGNORE 명령문을 중단하지 않고 다음 행으로 건너 뜁니다.

예를 들어, 테이블 t 기본 i가있는 경우 동일한 i 값을 여러 행에 삽입하려고하면 일반적으로 중복키 오류가 발생합니다.

mysql> INSERT INTO t (i) VALUES(1),(1);

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

 

IGNORE 사용하면 중복 키가 포함된 행이 여전히 삽입되지 않지만 오류 대신 경고가 발생합니다.

mysql> INSERT IGNORE INTO t (i) VALUES(1),(1);
Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 1  Warnings: 1

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '1' for key 'PRIMARY' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec)

 

문장은 IGNORE 키워드를 지원합니다.

+ CREATE TABLE ... SELECT : IGNORE 명령문의 CREATE TABLE 또는 SELECT 부분에는 적용되지 않지만 SELECT 의해 생성 테이블에 삽입됩니다. 고유키 값에서 기존 행을 복제하는 행은 삭제됩니다.

+ DELETE : IGNORE 행을 삭제하는 과정에서 MySQL 오류를 무시하도록 합니다.

+ 삽입 : IGNORE 사용하면 고유 값에서 기존 행을 복제하는 행이 삭제됩니다. 데이터 변환 오류를 유발하는 값으로 설정된 행은 가장 가까운 유효한 값으로 설정됩니다.

 

주어진 값과 일치하는 파티션이없는 파티션된 테이블의 경우, IGNORE 일치하지 않는 값을 포함하는 행에 대해 삽입 조작이 자동으로 실패하게합니다.

+ 데이터로드, XML로드 : IGNORE 사용하면 고유 값에서 기존 행을 복제하는 행이 삭제됩니다.

+ 업데이트 : IGNORE 사용하면 고유키 값에서 중복 충돌이 발생하는 행은 업데이트되지 않습니다. 데이터 변환 오류를 유발하는 값으로 업데이트된 행은 가장 가까운 유효한 값으로 업데이트됩니다.

 

IGNORE 키워드는 다음 오류에 적용됩니다.

ER_BAD_NULL_ERROR

ER_DUP_ENTRY

ER_DUP_ENTRY_WITH_KEY_NAME

ER_DUP_KEY

ER_NO_PARTITION_FOR_GIVEN_VALUE

ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT

ER_NO_REFERENCED_ROW_2

ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET

ER_ROW_IS_REFERENCED_2

ER_SUBQUERY_NO_1_ROW

ER_VIEW_CHECK_FAILED

 

▶︎ 명령문 실행에 대한 엄격한 SQL 모드의 영향

MySQL 서버는 다른 SQL모드에서 작동할 있으며 sql_mode 시스템 변수의 값에 따라이 모드를 다른 클라이언트에 다르게 적용할 있습니다. "엄격한"SQL 모드에서 서버는 특정 경고를 오류로 업그레이드합니다.

예를 들어, 엄격하지 않은 SQL 모드에서 문자열 'abc' 정수컬럼에 삽입하면 값이 0으로 변환되고 경고가 발생합니다.

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t (i) VALUES('abc');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: 'abc' for column 'i' at row 1 |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

 

엄격한 SQL 모드에서 유효하지 않은 값은 오류와 함께 거부됩니다.

mysql> SET sql_mode = 'STRICT_ALL_TABLES';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t (i) VALUES('abc');
ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'i' at row 1

 

엄격한 SQL 모드는 일부 값이 범위를 벗어나거나 유효하지 않은 행이 테이블에 삽입되거나 테이블에서 삭제되는 조건에서 다음 명령문에 적용됩니다.

+ ALTER TABLE

+ CREATE TABLE

+ CREATE TABLE ... SELECT

+ DELETE (both single table and multiple table)

+ INSERT

+ LOAD DATA

+ LOAD XML

+ SELECT SLEEP()

+ UPDATE (both single table and multiple table)

저장된 프로그램 내에서, 엄격 모드가 적용되는 동안 프로그램이 정의 경우 방금 나열된 유형의 개별 명령문이 엄격한 SQL 모드에서 실행됩니다.

 

엄격한 SQL 모드는 다음 오류에 적용되며 입력 값이 유효하지 않거나 누락 오류 클래스를 나타냅니다. 컬럼의 데이터 유형이 잘못되었거나 범위를 벗어난 경우 값이 유효하지 않습니다. 삽입 행에 정의에 명시 DEFAULT 절이없는 NOT NULL 컬럼의 값이 없으면 값이 누락됩니다.

ER_BAD_NULL_ERROR

ER_CUT_VALUE_GROUP_CONCAT

ER_DATA_TOO_LONG

ER_DATETIME_FUNCTION_OVERFLOW

ER_DIVISION_BY_ZERO

ER_INVALID_ARGUMENT_FOR_LOGARITHM

ER_NO_DEFAULT_FOR_FIELD

ER_NO_DEFAULT_FOR_VIEW_FIELD

ER_TOO_LONG_KEY

ER_TRUNCATED_WRONG_VALUE

ER_TRUNCATED_WRONG_VALUE_FOR_FIELD

ER_WARN_DATA_OUT_OF_RANGE

ER_WARN_NULL_TO_NOTNULL

ER_WARN_TOO_FEW_RECORDS

ER_WRONG_ARGUMENTS

ER_WRONG_VALUE_FOR_TYPE

WARN_DATA_TRUNCATED

 

■ SQL Mode Changes in MySQL 5.7

MySQL 5.7.22에서는 이러한 SQL 모드가 이상 사용되지 않으며 향후 버전의 MySQL (DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS)에서 이상 사용되지 않습니다.

 

MySQL 5.7에서는 ONLY_FULL_GROUP_BY SQL 모드가 기본적으로 활성화되어 있으며 기능별 종속성 감지를 포함하도록 GROUP BY 처리가보다 정교해졌습니다. 그러나 ONLY_FULL_GROUP_BY 활성화하면 기존 응용 프로그램에 대한 쿼리가 거부되는 경우 다음 작업 하나를 수행하여 작업을 복원해야합니다.

+ 문제가되는 쿼리를 수정할 수있는 경우 집계되지 않은 열이 기능적으로 GROUP BY 열에 종속되도록하거나 ANY_VALUE () 사용하여 집계되지 않은 열을 참조하도록 수정합니다.

+ 문제가되는 쿼리를 수정할 수없는 경우 ( : 타사 응용 프로그램에서 생성 경우) 서버 시작시 sql_mode 시스템 변수를 ONLY_FULL_GROUP_BY 사용하지 않도록 설정합니다.

 

MySQL 5.7에서는 ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE SQL 모드가 이상 사용되지 않습니다. 장기 계획은 가지 모드를 엄격한 SQL 모드에 포함시키고 향후 MySQL 릴리스에서 명시 모드로 제거하는 것입니다. MySQL 5.7 MySQL 5.6 엄격 모드의 호환성 영향을받는 응용 프로그램을 수정할 수있는 추가 시간을 제공하기 위해 다음 동작이 적용됩니다.

+ ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 엄격한 SQL 모드의 일부는 아니지만 엄격 모드와 함께 사용됩니다. 다시 말해, 엄격 모드를 활성화하지 않고 활성화하거나 비활성화하면 경고가 발생합니다.

+ ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE NO_ZERO_IN_DATE 기본적으로 활성화되어 있습니다.

앞의 변경 사항으로 인해 기본적으로보다 엄격한 데이터 검사가 활성화되어 있지만 현재 바람직하거나 필요한 환경에서는 개별 모드를 비활성화 있습니다.

Designed by JB FACTORY