设为首页 加入收藏

TOP

MySQL(四)--SQL_MODE
2019-03-19 01:43:12 】 浏览:59
Tags:MySQL --SQL_MODE
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w1992wishes/article/details/72818499

一.SQL_MODE简介

顾名思义,SQL_MODE为SQL模式,是一个重要但又比较容易让开发人员和DBA忽略的一个变量。

通过对其正确的设置可以完成一些约束检查的工作,设置时,可在配置文件my.cnf或my.ini中进行,也可在客户端中进行,并可分别进行全局的设置或当前会话的设置。

5.6以后默认的my.cnf文件里模式配置是sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES。

二.为什么需要SQL_MODE?

MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式。这样,应用程序就能对服务器操作进行量身定制以满足自己的需求。这类模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。这样,就能在众多不同的环境下,与其他数据库服务器一起更容易地使用MySQL。

三.警告

SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插入NOT NULL的字段中,也可以插入一些非法日期,如“2012-12-32”。因此在生产环境中强烈建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大。

四.查看SQL_MODE设置情况


五.设置SQL_MODE

5.1 会话级别,只对当前会话有效退出终端后既失效

5.2 全局级别,适用于所有会话,但仅限于本次mysql进程,下次重启还要重新设置

重新启动已经改变


六.MySQL的SQL_MODE选项

STRICT_TRANS_TALES(严格模式):
只对支持事务的表启用严格模式。

STRICT_ALL_TABLES(严格模式):
对所有引擎的表都启用严格模式。

严格模式:
在此模式下,一旦任何操作的数据产生问题,都将终止当前的操作,对于启用STRICT_ALL_TABLES的非事务引擎而言,这时数据可能停留在一个未知的状态,因此需非常小心这个选项可能带来的潜在影响。

ALLOW_INVALID_DATES:
不完全对日期合法性作检查,只检查月份是否在1~12,日期是否在1~31之间;仅对DATE和DATETIME有效,而对TIMESTAMP无效,因为TIMESTAMP总要求一个合法的输入。

ANSI_QUOTES:
启用后,不能用双引号来引用字符串,因为"(双引号)将被解释为标识符。


ERROR_FOR_DIVISION_BY_ZERO:
启用后,在insert或update过程中,若数据被零除(或MOD(x,0),则产生错误,若未启用,则产生警告,数据被零除时系统返回NULL。

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_PRECEDENCESQL模式,可以获得以前旧版本的更高优先级的结果。

IGNORE_SPACE:
启用后,忽略函数名和括号"("之间空格,要访问保存为关键字的数据库名,表名,列名时,需启用。

NO_AUTO_VALUE_ON_ZERO:

该选项影响列为自增长的插入。在默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

NO_BACKSLASH_ESCAPES:
反斜杠"\"作为普通字符而非转义字符。

NO_DIR_IN_CREATE:
在创建表时忽略所有index directory和datadirectory的选项。

NO_ENGINE_SUBSTITUTION:
启用后,若需要的存储引擎被禁用或未编译,则抛出错误;未启用时将用默认的存储引擎代替,并抛出一个异常。

NO_UNSIGNED_SUBSTRACTION:
启用后,两个UNSIGNED类型相减返回SIGNED类型。

NO_ZERO_DATE:
启用后,不允许插入“0000-00-00 00:00:00”形如此类的零日期,这将抛出一个错误,若未启用,则可插入但仅会抛出一个警告。

NO_ZERO_IN_DATE:
启用后,不允许月份和日期为零,和NO_ZERO_DATE一起启用,如“1999-01-00”将抛出错误而非警告。
若单独启用本项,则会抛出warning,然后插入如“0000-00-0000:00:00”。
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,若select中的列没有在group by中出现,那么这句SQL是不合法的。

PIPES_AS_CONCAT:
将"||"视为连接操作符而非“或运算符”。

REAL_AS_FLOAT:
将REAL视为FLOAT的同义词而非DOUBLE的同义词。

组合选项:

·ANSI:
REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、ANSI
·ORACLE:
PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER、ORACLE
·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、TRADITIONAL
·MSSQL:
PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、MSSQL、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、MSSQL
·DB2:
PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、DB2
·MYSQL323:
HIGH_NOT_PRECEDENCE、MYSQL323
·MYSQL40:
HIGH_NOT_PRECEDENCE、MYSQL40
·MAXDB:
PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER、MAXDB

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇flume   三大核心组件 下一篇ICC副本>>>>(logback..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目