5.1.7 서버 SQL 모드
MySQL Server는 다른 SQL 모드에서 작동 할 수 있고, sql_mode
시스템 변수의 값에 따라 다른 클라이언트에 이러한 다양한 모드를 적용 할 수 있습니다. DBA는 사이트 서버의 작동 요구 사항에 일치하는 글로벌 SQL 모드를 설정할 수 있으며, 각 응용 프로그램은 응용 프로그램의 세션 SQL 모드를 응용 프로그램 고유의 요구 사항을 설정할 수 있습니다.
모드는 MySQL이 지원하는 SQL 구문과 MySQL이 실행하는 데이터 유효성 검사에 영향을줍니다. 그러면 MySQL을 다양한 환경에서 사용하거나 MySQL을 다른 데이터베이스 서버와 함께 사용하는 것이 더 쉬워집니다.
Setting the SQL Mode
The Most Important SQL Modes
Full List of SQL Modes
Strict SQL Mode
Combination SQL Modes
MySQL 서버 SQL 모드에 대한 자주 묻는 질문에 대한 대답은 섹션 A.3 "MySQL 5.6 FAQ : 서버 SQL 모드" 를 참조하십시오.
InnoDB
테이블을 조작 할 때 innodb_strict_mode
시스템 변수도 고려하십시오. 이는 InnoDB
테이블의 추가 오류 검사가 가능합니다.
SQL 모드 설정
MySQL 5.6.6 이후의 기본 SQL 모드는 NO_ENGINE_SUBSTITUTION
에서 MySQL 5.6.5 이전 버전에서는이 비어 있습니다 (모드 설정 없음).
서버 시작시에 SQL 모드를 설정하려면 명령 줄에서 --sql-mode="
옵션을 사용하거나 modes
"my.cnf
(Unix 운영 체제) 또는 my.ini
(Windows) 등의 옵션 파일에서 sql-mode="
를 사용합니다. modes
"modes
는 콤마로 구분되는 다양한 모드의 목록입니다. SQL 모드를 명시 적으로 삭제하려면 명령 줄에서 --sql-mode=""
를 사용하거나 옵션 파일에서 sql-mode=""
를 사용하여 SQL 모드를 빈 문자열로 설정 합니다.
MySQL 설치 프로그램은 설치 과정에서 SQL 모드를 구성 할 수 있습니다. 예를 들어, mysql_install_db는 my.cnf
라는 기본 옵션 파일을 기본 설치 디렉토리에 만듭니다. 이 파일에는 SQL 모드를 설정하는 행이 포함되어 있습니다. 섹션 4.4.3 "mysql_install_db - MySQL 데이터 디렉토리 초기화" 를 참조하십시오.
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 모드를 사용하십시오.
자세한 내용은 섹션 19.6 "파티셔닝 제약 및 제한" 을 참조하십시오.
가장 중요한 SQL 모드
다음으로 많은 경우에서 가장 중요한 sql_mode
값을 나타냅니다.
ANSI
이 모드는 구문 및 동작이 표준 SQL에 더욱 긴밀하게 준수하도록 변경합니다. 이것은이 섹션의 끝에 나열된있는 특수 조합 모드 중 하나입니다.
STRICT_TRANS_TABLES
값을 지정한대로 트랜잭션 테이블에 삽입 할 수없는 경우, 문을 중단합니다. 비 트랜잭션 테이블의 경우 값이 단일 행 문에서 발생하거나 여러 행 문의 첫 번째 줄 발생한 경우 문을 중지합니다. 자세한 내용은이 섹션의 나머지 부분에서 설명합니다.
TRADITIONAL
MySQL을 "기존의"SQL 데이터베이스 시스템처럼 작동시킵니다. 이 모드를 간단하게 설명하면 열에 잘못된 값을 삽입 할 때 "경고가 아니라 오류를 반환"입니다. 이것은이 섹션의 끝에 나열된있는 특수 조합 모드 중 하나입니다.
참고INSERT
또는UPDATE
오류가 발견되면 즉시 중지합니다. 비 트랜잭션 스토리지 엔진을 사용하는 경우에는 이렇게 동작하지 않을 수도 있습니다. 오류의 전에 행해진 데이터 변경은 롤백되지 않고, "부분적으로 수행 된"업데이트 될 수 있기 때문입니다.
이 설명서의 "엄격 모드"는 STRICT_TRANS_TABLES
또는 STRICT_ALL_TABLES
중 하나 또는 모두 활성화 모드를 의미합니다.
SQL 모드의 전체 목록
다음 목록은 지원되는 모든 SQL 모드에 대해 설명하고 있습니다.
ALLOW_INVALID_DATES
날짜의 전체 검사를 수행하지 않습니다. 달이 1에서 12까지의 범위에 있는지 확인하고, 일이 1에서 31까지의 범위에 있는지 만 검사합니다. 이것은, 년, 월, 일을 세 가지 필드로 가서 사용자가 삽입 한 데이터를 (날짜 검증을 거치지 않고) 그대로 저장하는 Web 어플리케이션에서는 매우 편리합니다. 이 모드는
DATE
와DATETIME
컬럼에 적용됩니다.TIMESTAMP
컬럼은 유효한 날짜가 항상 필요하기 때문에,이 컬럼에는 적용되지 않습니다.서버는 달과 날의 값이 각각 1에서 12 또는 1에서 31의 범위에있는 것뿐만 아니라 올바른 값인 것을 요구합니다. 엄격 모드가 비활성화되어 있으면,
'2004-04-31'
과 같은 잘못된 날짜는'0000-00-00'
로 변환되고 경고 메시지가 표시됩니다. 엄격 모드가 활성화되면 잘못된 날짜가 오류가 발생합니다. 이러한 날짜를 허용하려면ALLOW_INVALID_DATES
을 사용합니다.ANSI_QUOTES
"
"
"을 ( '`
'인용 부호 문자처럼) 식별자 따옴표 문자로 취급 문자열 따옴표 문자로 취급하지 않습니다. 이 모드를 사용하여 식별자를 인용하기 위해 "`
"을 계속 사용할 수 있습니다.ANSI_QUOTES
를 활성화하면 큰 따옴표를 사용하여 문자열 리터럴을 인용 할 수 없습니다 (리터럴 문자열 식별자로 해석되므로).ERROR_FOR_DIVISION_BY_ZERO
ERROR_FOR_DIVISION_BY_ZERO
모드는MOD(
을 포함 0으로 나누기의 처리에 영향을줍니다. 데이터 변경 작업 (N
,0)INSERT
,UPDATE
)의 경우,이 효과는 엄격한 SQL 모드가 유효한지 여부에 따라.이 모드가 활성화되지 않은 경우 0으로 나누기는
NULL
을 삽입 경고가 생성되지 않습니다.이 모드가 활성화되면 0으로 나누기는
NULL
을 삽입하고 경고가 생성됩니다.이 모드 및 엄격 모드가 활성화되면 0으로 나누기 오류를 생성하지만,
IGNORE
도 지정되어있는 경우는 예외입니다.INSERT IGNORE
및UPDATE IGNORE
의 경우 0으로 나누기는NULL
을 삽입하고 경고가 생성됩니다.
SELECT
의 경우 0으로 나누기는NULL
을 반환합니다.ERROR_FOR_DIVISION_BY_ZERO
을 사용하면 엄격 모드가 활성화 여부에 관계없이 경고도 생성됩니다.MySQL 5.6.17 이상에서
ERROR_FOR_DIVISION_BY_ZERO
은되지 않으며이를 포함하도록sql_mode
값을 설정하면 경고가 생성됩니다. MySQL 5.7에서는이 모드는 아무것도 실시하지 않습니다. 대신이 효과는 엄격 모드의 효과에 포함되어 있습니다.HIGH_NOT_PRECEDENCE
NOT
연산자의 존재에 의해NOT a BETWEEN b AND c
같은 식은NOT (a BETWEEN b AND c)
로서 구문 분석됩니다. 일부 구형 MySQL 버전에서는이 표현은(NOT a) BETWEEN b AND 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;
-> 1IGNORE_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 또는 스토어드 함수 이름 뒤에 공백이 항상 허용됩니다.IGNORE_SPACE
대한 자세한 내용은 섹션 9.2.4 "함수 이름의 구문 분석과 해결" 을 참조하십시오.NO_AUTO_CREATE_USER
인증 정보가 지정되는 경우를 제외하고 다른 방법으로 실행되는 경우
GRANT
문에서 새 사용자를 자동으로 생성하지 않습니다. 문은IDENTIFIED BY
를 사용하여 비어 있지 않은 암호를 지정하거나IDENTIFIED WITH
를 사용하여 인증 플러그인을 지정해야합니다.NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO
는AUTO_INCREMENT
컬럼의 처리에 영향을줍니다. 일반적으로NULL
또는0
을 컬럼에 삽입하면 컬럼의 다음 시퀀스 번호를 생성합니다.NO_AUTO_VALUE_ON_ZERO
는0
이 동작을 억제하기 위해NULL
만 다음 시퀀스 번호를 생성합니다.이 모드는 테이블의
AUTO_INCREMENT
컬럼에0
이 저장되어있는 경우에 유용 할 수 있습니다. (단,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
을 해제하면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
의 경우 정수 피연산자 간의 뺄셈UNSIGNED
결과를 생성합니다.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 % 사용할 수 없다는 것을 의미합니다. 섹션 12.10 「캐스트 함수 및 연산자 " 를 참조하십시오.mysql>
SET sql_mode = '';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+---------------------------+ | CAST (0 AS UNSIGNED) - 1 | +---------------------------+ | 18446744073709551615 | +---------------------------+ mysql>SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+ | CAST(0 AS UNSIGNED) - 1 | +-------------------------+ | -1 | +-------------------------+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'
은 허용되고 삽입에 의해 경고가 생성됩니다.
MySQL 5.6.17 이후에서는
NO_ZERO_DATE
은되지 않으며이를 포함하도록sql_mode
값을 설정하면 경고가 생성됩니다. MySQL 5.7에서는이 모드는 아무것도 실시하지 않습니다. 대신이 효과는 엄격 모드의 효과에 포함되어 있습니다.NO_ZERO_IN_DATE
NO_ZERO_IN_DATE
모드는 연도 부분은 비 제로이지만 달 또는 날의 부분이 0 인 날짜를 서버가 허용 여부에 영향을줍니다. (이 모드는'2010-00-01'
또는'2010-01-00'
등의 날짜에 영향을 주지만,'0000-00-00'
에 영향을주지 않습니다. 서버가'0000-00-00'
를 허용할지 여부를 제어하려면NO_ZERO_DATE
모드를 사용하십시오.)NO_ZERO_IN_DATE
의 영향은 엄격한 SQL 모드가 활성화 여부에 따라 달라집니다.이 모드가 유효하지 않은 경우, 제로 부분을 포함한 날짜는 허용되지 삽입에 의해 경고가 생성되지 않습니다.
이 모드가 활성화되면 제로 부분을 포함한 날짜는
'0000-00-00'
로 삽입되고 경고가 생성됩니다.이 모드 및 엄격 모드를 사용하는 경우
IGNORE
도 지정되어있는 경우를 제외하고는 제로 부분을 포함한 날짜는 허용되지 않고 삽입에서 오류가 발생됩니다.INSERT IGNORE
및UPDATE IGNORE
의 경우 제로 부분을 포함한 날짜는'0000-00-00'
로 삽입되고 경고가 생성됩니다.
MySQL 5.6.17 이후에서는
NO_ZERO_IN_DATE
은되지 않으며이를 포함하도록sql_mode
값을 설정하면 경고가 생성됩니다. MySQL 5.7에서는이 모드는 아무것도 실시하지 않습니다. 대신이 효과는 엄격 모드의 효과에 포함되어 있습니다.ONLY_FULL_GROUP_BY
GROUP BY
절에서 이름이 지정되지 않은 비 - 집합 컬럼을 선택 목록,HAVING
조건 또는 (MySQL 5.6.5 이후)ORDER
목록을 참조하는 쿼리를 거부합니다.ONLY_FULL_GROUP_BY
이 유효한 경우 다음 쿼리는 무효입니다. 1 번째는 선택 목록에서 비 집계address
열이GROUP BY
절에 이름을 지정되어 있지 않고, 두 번째는HAVING
절max_age
이GROUP BY
절에 이름을 지정되어 있지 않기 때문에 모두 해제 됩니다.mysql>
SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000) : 't.address'is not in GROUP BYmysql>
SELECT name, MAX(age) AS max_age FROM t GROUP BY name
->HAVING max_age < 30;
Empty set (0.00 sec) ERROR 1463 (42000) : Non-grouping field 'max_age'is used in HAVING clause두 번째 예에서는
HAVING MAX(age)
를 사용하도록 쿼리를 고쳐 쓰는 것으로 집계 함수에 이름을 지정되어있는 컬럼이 참조 될 수 있습니다. (max_age
는 집계 함수 그 자체이기 때문에 실패합니다.)쿼리에 집계 함수가 있고
GROUP BY
절이 없으면,ONLY_FULL_GROUP_BY
가 활성화되면 쿼리 선택 목록 또는ORDER BY
목록에 비 - 집합 컬럼을 포함 할 수 없습니다.mysql>
SELECT name, MAX(age) FROM t;
ERROR 1140 (42000) : Mixing of GROUP columns (MIN (), MAX (), COUNT (), ...) with no GROUP columns is illegal if there is no GROUP BY clause추가 설명은 섹션 12.19.3 "MySQL의 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()
와 마찬가지로) 문자열 연결 연산자로 취급합니다.REAL_AS_FLOAT
REAL
을FLOAT
의 동의어로 취급합니다. 기본적으로 MySQL은REAL
을DOUBLE
의 동의어로 취급합니다.STRICT_ALL_TABLES
모든 스토리지 엔진에 대해 엄격 모드를 활성화합니다. 잘못된 데이터 값은 거부됩니다. 추가 정보는 뒤 부분에서 설명합니다.
STRICT_TRANS_TABLES
트랜잭션 스토리지 엔진 엄격 모드를 활성화하고 가능하면 비 트랜잭션 스토리지 엔진도 사용합니다. 추가 정보는 뒤 부분에서 설명합니다.
엄격한 SQL 모드
엄격 모드는 MySQL이 INSERT
나 UPDATE
등의 데이터 수정 문에서 잘못된 값 또는 누락 된 값을 처리하는 방법을 제어합니다. 값은 몇 가지 이유에서 비활성화 될 수 있습니다. 예를 들어, 컬럼에 대해 잘못된 데이터 유형을 가지고 있거나 범위를 벗어난이거나 할 수 있습니다. 값의 누락이 발생하는 것은 삽입 된 새 행의 비 NULL
컬럼에 값이 포함되지 않고, 그 컬럼에 명시적인 DEFAULT
구가 정의되어 있지 않은 경우입니다. ( NULL
컬럼의 경우 값이 누락 된 경우 NULL
이 삽입됩니다.)
엄격 모드가 유효하지 않은 경우, MySQL은 유효하지 않거나 누락 된 값에 대해 조정 된 값을 삽입하고 경고를 생성합니다 ( 섹션 13.7.5.41 "SHOW WARNINGS 구문" 을 참조하십시오). 엄격 모드에서는 INSERT IGNORE
또는 UPDATE IGNORE
를 사용하면이 작업을 수행 할 수 있습니다.
데이터를 변경하지 SELECT
등의 문의 경우 엄격 모드에서는 유효하지 않은 값은 오류가 아니라 경고를 생성합니다.
엄격 모드는 외래 키 제약 조건 검사 여부에 영향을받지 않습니다. foreign_key_checks
을 검사에 사용할 수 있습니다. ( 섹션 5.1.4 "서버 시스템 변수" 를 참조하십시오.)
엄격한 SQL 모드는 STRICT_ALL_TABLES
또는 STRICT_TRANS_TABLES
중 하나가 유효한 경우에 사용할 수 있지만이 모드의 영향은 다소 다릅니다.
트랜잭션 테이블의 경우
STRICT_ALL_TABLES
또는STRICT_TRANS_TABLES
중 하나가 활성화되면 데이터 수정 문에 잘못된 값 또는 누락 된 값에 오류가 발생합니다. 문은 중단되고 롤백됩니다.비 트랜잭션 테이블의 경우 삽입 또는 갱신되는 첫 번째 행에 잘못된 값이있을 때, 어느 모드에서도 동작 동일 문이 중단되고 테이블은 변경되지 않습니다. 문이 여러 행을 삽입하거나 수정하고 다음 행에 잘못된 값이있는 경우 두 엄격 모드가 활성화되어 있는지에 따라 결과가 달라집니다.
STRICT_ALL_TABLES
, MySQL은 오류를 반환하고 나머지 행을 무시합니다. 그러나 이전의 행을 삽입하거나 업데이트되어 있기 때문에 결과는 부분 업데이트됩니다. 이를 방지하려면 테이블을 변경하지 않고 중단 할 단일 행 문을 사용합니다.STRICT_TRANS_TABLES
, MySQL은 유효하지 않은 값을 컬럼에 대해 가장 가까운 유효한 값으로 변환하고, 조정 된 값을 삽입합니다. 값이 누락 된 경우, MySQL은 컬럼 데이터 유형의 암시 적 기본 값을 삽입합니다. 어떤 상황에서도 MySQL은 오류가 아니라 경고를 생성하고 문을 계속 처리합니다. 암시 적 기본 내용은 섹션 11.6 "데이터 유형 기본값" 에 기재되어 있습니다.
엄격 모드는 ERROR_FOR_DIVISION_BY_ZERO
, NO_ZERO_DATE
및 NO_ZERO_IN_DATE
모드에 관련하여 0으로 나누기 제로 날짜 및 날짜의 제로 처리에도 영향을 미칩니다. 자세한 내용은이 모드의 설명을 참조하십시오.
조합 SQL 모드
다음 특수 모드는 이전 목록의 모드 값의 조합을 나타내는 생략 표현으로 볼 수 있습니다.
ANSI
REAL_AS_FLOAT
,PIPES_AS_CONCAT
,ANSI_QUOTES
,IGNORE_SPACE
과 동일합니다.또한
ANSI
모드는 외부 참조
을 가지는 설정 함수S ( outer_ref )
S
가 외부 참조가 해결되는 외부 쿼리에서 집계 할 수없는 경우 쿼리 서버가 오류를 반환합니다. 이러한 쿼리를 보여줍니다.SELECT * FROM t1 WHERE t1.a IN (SELECT MAX (t1.b) FROM t2 WHERE ...);
여기서
MAX(t1.b)
는 해당 쿼리의WHERE
절에 지정되어 있기 때문에 외부 쿼리에서 집계 할 수 없습니다. 표준 SQL에서는이 상황에서 오류가 발생합니다.ANSI
모드가 유효하지 않은 경우, 서버는 그러한 쿼리의
를S ( outer_ref )
을 해석하는 같은 방법으로 취급합니다.S ( const )
섹션 1.8 "MySQL의 표준 준수" 를 참조하십시오.
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
NO_FIELD_OPTIONS
,HIGH_NOT_PRECEDENCE
과 동일합니다.MYSQL40
NO_FIELD_OPTIONS
,HIGH_NOT_PRECEDENCE
과 동일합니다.ORACLE
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
STRICT_TRANS_TABLES
,STRICT_ALL_TABLES
,NO_ZERO_IN_DATE
,NO_ZERO_DATE
,ERROR_FOR_DIVISION_BY_ZERO
,NO_AUTO_CREATE_USER
및NO_ENGINE_SUBSTITUTION
과 동일합니다.