> 데이터 베이스 > MySQL 튜토리얼 > Mysql의 SQL 서버 모드에 대한 간략한 소개

Mysql의 SQL 서버 모드에 대한 간략한 소개

怪我咯
풀어 주다: 2017-04-01 10:42:39
원래의
1364명이 탐색했습니다.

mysql SQL Server 모드
MySQL 서버는 다양한 SQL 모드에서 작동할 수 있으며, 다양한 클라이언트에 다양한 모드를 적용할 수 있습니다. 이런 방식으로 각 응용 프로그램은 자체 필요에 따라 서버의 작동 모드를 사용자 정의할 수 있습니다.
스키마는 MySQL이 지원해야 하는 SQL 구문과 수행해야 하는 데이터 유효성 검사의 종류를 정의합니다. 이를 통해 다양한 환경 및 다른 데이터베이스 서버에서 MySQL을 더 쉽게 사용할 수 있습니다. --sql-mode="modes" 옵션으로 mysqld를 시작하여 기본 SQL 모드를 설정할 수 있습니다. 재설정하려는 경우 이 값을 비워 둘 수도 있습니다(--sql-mode = ""). 시작 후 SET [SESSION|GLOBAL] sql_mode='modes' 문을 사용하여 sql_mode
변수
를 설정하여 SQL 모드를 변경할 수도 있습니다. GLOBAL 변수를 설정하려면 SUPER 권한이 필요하며 해당 시점부터 연결된 모든 클라이언트의 작동에 영향을 미칩니다. SESSION 변수 설정은 현재 클라이언트에만 영향을 미칩니다. 모든 클라이언트는 언제든지 해당 세션의 sql_mode 값을 변경할 수 있습니다. Modesis는 쉼표(',')로 구분된 일련의 모드입니다. SELECT @@sql_mode 문 을 사용하여 현재 모드를 쿼리
할 수 있습니다. 기본값은 비어 있습니다(모드가 설정되지 않음). 주로 중요한 sql_mode 값
・ANSI
표준 SQL과 더 일관되도록 구문과 동작을 변경합니다.
・STRICT_TRANS_TABLES
주어진 값을 트랜잭션 테이블에 삽입할 수 없으면 명령문을 중단합니다. 비트랜잭션 테이블의 경우 단일 행 명령문이나 다중 행 명령문의 행 1에 값이 나타나면 해당 명령문은 삭제됩니다. 자세한 설명은 이 섹션의 뒷부분에서 제공됩니다.
・전통적인
MySQL을 "전통적인" SQL 데이터베이스 시스템처럼 작동하도록 만듭니다. 이 모드에 대한 간단한 설명은 잘못된 값이 열에 삽입될 때 "경고 대신 오류를 표시"하는 것입니다. 참고
: 오류가 발견되는 즉시 INSERT/UPDATE를 포기하세요. 이는 비트랜잭션 스토리지 엔진을 사용하는 경우 원하는 것이 아닙니다. 오류 이전에 변경된 데이터는 "롤오버"되지 않아 업데이트가 "부분적으로만 이루어지기" 때문입니다. 본 매뉴얼에서는 "엄격 모드"를 지칭하며, 이는 최소한 STRICT _TRANS_TABLES 또는 STRICT _ALL_TABLES가 활성화된 모드를 의미합니다. 지원되는 모든 모드는 아래에 설명되어 있습니다.

・ALLOW_INVALID_DATES
엄격 모드에서는 모든 날짜를 확인하지 마세요. 1~12일 사이의 월과 1~31일 사이의 일만 확인합니다. 이는 세 가지 다른 필드에서 연도, 월, 일을 가져오고 사용자가 삽입한 내용을 정확하게 저장하려는 경우(날짜 유효성 검사 없이) 웹 애플리케이션에서 중요합니다. 이 모드는 DATE 및 DATETIME 열에 대해 작동합니다. 날짜 유효성 검사가 필요한 TIMESTAMP 열에는 적합하지 않습니다. 엄격 모드가 활성화된 경우 서버에는 각각 1~12 및 1~31 범위뿐만 아니라 유효한 월과 일이 필요합니다. 예를 들어 '2004-04-31'은 엄격 모드가 비활성화된 경우 유효하지만 엄격 모드가 활성화된 경우에는 불법입니다. 엄격 모드에서 고정 날짜의 마스킹을 허용하려면 ALLOW_INVALID_DATES도 활성화해야 합니다.

・ANSI_QUOTES
'"'를 문자열
에 대한 인용 문자가 아닌 식별자 인용(''' 인용 문자)으로 처리합니다. ANSI 모드에서는 다음을 수행할 수 있습니다. 식별자를 인용하려면 여전히 '`'를 사용하세요. ANSI_QUOTES를 사용하면 문자열이 INSERT 중에 ・ERROR_FOR_pISION_BY_ZERO식별자로 해석되기 때문에 큰따옴표로 문자열을 인용할 수 없습니다. 또는 UPDATE, 0으로 나누면(또는 MOD(X, 0)) 0으로 나눌 때 오류가 발생합니다(그렇지 않으면 경고). INSERT IGNORE 또는 UPDATE IGNORE에 사용되는 경우 NULL
을 반환합니다. , MySQL은 0으로 나누기 경고를 생성하지만 연산 결과는 NULL입니다. HIGH_NOT_PRECEDENCENOT
연산자 의 우선순위는 표현식입니다. c는 NOT(a BETWEEN b AND c)으로 해석됩니다. 일부 이전 버전의 MySQL에서는 a) BETWEEN b AND c로 해석됩니다. 이전의 더 높은
우선 순위를 얻으려면 HIGH_NOT_PRECEDENCESQL 모드를 활성화하세요. > 결과.

mysql> SET sql_mode = '';

mysql> SELECT NOT 1 BETWEEN -5 AND 5;

        -> 0

mysql> SET sql_mode = 'broken_not';

mysql> SELECT NOT 1 BETWEEN -5 AND 5;

        -> 1
로그인 후 복사

・IGNORE_SPACE
함수 이름과 '(' 사이에 공백을 허용합니다. 모든 함수 이름을 저장된 단어로 처리하도록 강제합니다. 결과는 다음과 같습니다. 단어로 저장된 데이터베이스, 테이블 또는 열 이름에 액세스하려면 이를 인용해야 합니다. 예를 들어 USER() 함수 때문에 mysql 데이터베이스의 사용자 테이블 이름과 테이블의 사용자 열은 다음과 같습니다. 저장되었으므로 인용해야 합니다:

SELECT "User" FROM mysql."user";
로그인 후 복사

・NO_AUTO_CREATE_USER
防止GRANT自动创建新用户,除非还指定了密码。
・NO_AUTO_VALUE_ON_ZERO
NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况,你可以向该列插入NULL或0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。
如果将0保存到表的AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用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
如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
・NO_FIELD_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用列选项。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_KEY_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用索引选项。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_TABLE_OPTIONS
不要在SHOW CREATE TABLE的输出中打印MySQL专用表选项(例如ENGINE)。该模式在可移植模式(portability mode)下用于mysqldump。
・NO_UNSIGNED_SUBTRACTION
在减运算中,如果某个操作数没有符号,不要将结果标记为UNSIGNED。请注意这样使UNSIGNED BIGINT不能100%用于上下文中。参见12.8节,“Cast函数和操作符”。
・NO_ZERO_DATE
在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
・NO_ZERO_IN_DAT
在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。
・ONLY_FULL_GROUP_BY
不要让GROUP BY部分中的查询指向未选择的列。
・PIPES_AS_CONCAT
将||视为字符串连接操作符(+)(同CONCAT()),而不视为OR。
・REAL_AS_FLOAT
将REAL视为FLOAT的同义词,而不是DOUBLE的同义词。
・STRICT_TRANS_TABLES
为所有存储引擎启用严格模式。非法数据值被拒绝。后面有详细说明。
・STRICT_TRANS_TABLES
为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式。后面有详细说明。
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
・对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。
・对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。13.1.5节,“CREATE TABLE语法”描述了隐式默认值。
엄격 모드에서는 '2004-04-31'과 같은 잘못된 날짜를 허용하지 않습니다. '2004-04-00' 또는 '0' 날짜와 같이 '0' 부분을 사용하는 금지된 날짜는 허용되지 않습니다. 이를 비활성화하려면 엄격 모드를 기반으로 NO_ZERO_IN_DATE 및 NO_ZERO_DATE SQL 모드를 활성화합니다.
엄격 모드를 사용하지 않는 경우(예: STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 모드를 활성화하지 않음) MySQL은 조정된 값을 삽입하고 잘못된 값 또는 누락된 값에 대해 경고를 표시합니다. 엄격 모드에서는 INSERT IGNORE 또는 UPDATE IGNORE를 통해 이 작업을 수행할 수 있습니다. 섹션 13.5.4.22, "경고 표시 구문"을 참조하십시오.


위 내용은 Mysql의 SQL 서버 모드에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿