设为首页 收藏本站
查看: 652|回复: 0

[经验分享] MYSQL SQL模式 (未完成)

[复制链接]

尚未签到

发表于 2018-10-6 10:55:25 | 显示全部楼层 |阅读模式
  SQL模式影响MySQL支持的SQL语法和执行的数据验证检查。
  本篇内容根据官方手册https://dev.mysql.com/doc/refman/5.7/en/sql-mode.htmlvgli 进行整理
  已完成部分:设置和查询SQL模式、MySQL5.7中SQL模式的完整列表
  未完成部分:严格模式的详细描述、IGNORE关键字和严格模式的关系、在MySQL5.7中SQL模式的更改
设置和查询SQL模式
  通过修改sql_mode变量的值来改变SQL模式。
  SQL模式可以在全局级别下设置,也可以在会话级别下设置。在数据库启动时和数据库运行时都可以对sql_mode的值进行修改。
在数据库启动时设置SQL模式
  在命令行中使用--sql_mode='modes'选项,或者在配置文件中使用sql_mode="modes"。
  modes是一个以逗号分隔的模式的列表。
  要清除SQL模式,将它设置为一个空的字符串,例如sql_mode=""
在数据库运行时设置SQL模式
  使用SET语句来更改sql_mode的值,例如:
  SET GLOBAL sql_mode = 'modes';
  SET SESSION sql_mode = 'modes';
  设置全局变量的值需要SUPER权限,设置后应用到之后所有客户端连接的操作。
  设置session变量只应用于当前客户端,每个客户端都可以在任何时候更改它的sessionSQL模式。
查询SQL模式
  要确定当前使用的SQL模式,使用以下语句进行查询
  SELECT @@GLOBAL.sql_mode;
  SELECT @@SESSION.sql_mode;
主要的SQL模式
  主要的sql_mode的值为以下几种:

  • ANSI  这是一个组合模式,它似的语法和行为更符合标准的SQL
  • STRICT_TRANS_TABLES  对事务表的严格模式。在这种模式下,如果一个值不能被插入到事务表中,则终止该语句。对于非事务表,如果不能插入的值发生在单行语句或者多行语句的第一行,也会终止该语句。
  • TRADITIONAL  传统模式,这也是一个组合模式。在这种模式下,当插入一个不正确的值时,会给出错误而不是警告。(在非事务性存储引擎中,可能这不是我们想要的,因为在发生错误时语句会中断,但是在错误发生前进行的数据修改不能够回滚,从而导致部分更新。)
SQL模式的完整列表
  sql模式可以大致分为以下几类
严格模式(包括STRICT_ALL_TABLES和STRICT_TRANS_TABLES)

  • STRICT_ALL_TABLES  对于所有存储引擎启用严格模式,无效的值会被拒绝。
  • STRICT_TRANS_TABLES  对于事务存储引擎启用严格模式,并在可能的情况下对飞事务存储引擎启用严格模式。
  在MySQL5.7.4到MySQL5.7.7中,严格模式包括ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE和NO_ZERO_IN_DATE的效果。
用来限制0值,和严格模式一同使用的

  • NO_ZERO_DATE  影响数据库是否允许'0000-00-00'作为一个有效的日期。其效果还取决于是否启用了严格模式
      如果启用了该模式,允许'0000-00-00'值并且插入不会产生警告
      如果禁用了该模式,允许'0000-00-00'值但是插入会产生警告
      如果该模式和严格模式同时启用,除非同时给出IGNORE,否则不允许'0000-00-00'插入并产生错误
  • NO_ZERO_IN_DATE  影响数据库是否允许在年份非0时,月份或日期为0。其效果还取决于是否启用了严格模式。
      如果启用了该模式,允许包括0的日期值并且插入不会产生警告。
      如果禁用了该模式,允许包括0的日期值但是插入会产生警告。
      如果该模式和严格模式同时使用,除非同时给出IGNORE,否则不允许插入包含0的日期值并且插入会产生错误。对于INSERT IGNORE和UPDATE IGNORE,包含0的日期值会作为'0000-00-00'插入并产生警告
  • ERROR_FOR_DIVISION_BY_ZERO  影响数据库是否允许将0作为除数,包括MOD(N,0)。其效果还取决于是否启用了严格模式
      如果启用了该模式,允许以0作为除数并且插入不会产生警告
      如果禁用了该模式,允许以0作为除数但是插入会产生警告
      如果该模式和严格模式同时使用,除非同时给出IGNORE,否则不允许以0作为除数并且插入会产生错误。对于INSERT IGNORE和UPDATE IGNORE,以0作为除数会插入NULL并产生警告。
  在MySQL5.7.4以前版本中,以上三个模式被弃用
  在MySQL5.7.4到MySQL5.7.7中,以上三个模式不产生作用,他们的效果包含在严格模式中。
  在MySQL5.7.8及以后版本中,以上三个模式才有自己单独的作用,而不是严格模式的一部分。但是,他们应该和严格模式一起使用,并且默认情况下他们都是开启的。如果使用严格模式而不使用上述模式会产生警告,如果使用上述模式中的任何一个但是不启用严格模式也会产生警告。
  由于以上三个模式以弃用,在后续的MySQL版本中,他们作为一个单独的模式名会被删除,并且他们的效果将包含在严格模式中。
用来说明符号的作用的

  • ANSI_QUOTES  将"作为标识符(与`相同)而不是作为字符串的引用符号。在启用此模式的情况下,仍然可以使用`作为引用标识符,但是不能使用双引号来引用文本字符串。
  • PIPES_AS_CONCAT  将||作为字符串连接操作符(与CONCAT()相同),而不是作为OR的同义词
  • REAL_AS_FLOAT  将REAL作为FLOAT的同义词。默认情况下,MySQL将REAL视为DOUBLE的同义词。
  • NO_BACKSLASH_ESCAPES  禁用反斜杠字符()作为字符串中的转义字符。在启用此模式后,反斜杠就变成了一个普通字符。
    影响语句的方式或结果的
  •   NO_UNSIGNED_SUBTRACTION
      对于整数之间的减法,如果一个值的类型是UNSIGNED,默认生成一个无符号整型的结果,但是如果结果是个负数,就会出现错误
      如果启用NO_UNSIGNED_SUBTRACTION,结果为负时不会报错
  •   IGNORE_SPACE
      在函数名和(中间允许空格。这将导致内置函数名被当作保留字处理。因此,与函数名相同的标识符必须被引用。
      例如,因为存在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)

  • HIGH_NOT_PRECEDENCE  在MySQL5.7中,NOT a BETWEEN b AND C的计算顺序为,NOT (a BETWEEN b AND c)
      启用HIGH_NOT_PRECEDENCE后,该顺序更改为(NOT a) BETWEEN b AND c
用来限制SHOW CREATE TABLE语句的输出结果的

  • NO_FIELD_OPTIONS  在SHOW CREATE TABLE的输出中不显示特定与MySQL的列选项
  • NO_KEY_OPTIONS  在SHOW CREATE TABLE的输出中不显示特定与MySQL的索引选项
  • NO_TABLE_OPTIONS  在SHOW CRETAE TABLE的输出中不显示特定与MySQL的表选项
影响数据库的行为的

  • NO_AUTO_CREATE_USER  如果不指定身份验证信息,GRANT语句不会自动创建用户。GRANT语句必须使用IDENTIFIED BY语句指定一个非空的密码或者使用IDENTIFIED WITH语句指定认证插件。
      建议使用CREATE USER语句来创建用户
  • NO_AUTO_VALUE_ON_ZERO  NO_AUTO_VALUE_ON_ZERO 影响对于自动增长列的处理。通常,通过插入NULL或者0来生成下一个序列号。NO_AUTO_VALUE_ON_ZERO允许在自动增长列中插入0值,这样只有插入NULL才能生成下一个序列号。
  • NO_ENGINE_SUBSTITUTION  当一个语句,例如CREATE TABLE或ALTER TABLE指定一个禁用或者未编译的存储引擎时,自动替换为默认存储引擎。当没有启用NO_ENGINE_SUBSTITUTION时。如果指定的存储引擎不可用,对于CREATE TABLE,使用默认存储引擎并生成警告,对于ALTER TABLE,生成警告并且不会对表进行修改。
      当启用NO_ENGINE_SUBSTITUTION时,如果指定的存储引擎不可用,无论是创建表还是修改表都会导致错误。
  • PAD_CHAR_TO_FULL_LENGTH  默认情况下,在查询时,CHAR列末尾的空格会自动删除。启用PAD_CHAR_TO_FULL_LENGTH,则不会删除空格,将查询到的CHAR值补全到完整的列长度。
  • NO_DIR_IN_CREATE  在创建表时,忽略所有INDEX DIRECTORY和DATA DIRECTORY指令。这个选项在复制的从库中很有用。
  • ONLY_FULL_GROUP_BY  在SELECT HAVING或者ORDER BY列表中不能包含没有在GROUP BY子句中命名或者不能通过GROUP BY子句唯一确定的列
      请参考http://www.ywnds.com/?p=8184
  • ALLOW_INVALID_DATES  允许无效的日期,只检查月份在1-12之间和日期在1-31之间,不对日期进行完整的检查。这个模式只应用与DATE和DATETIME列。在严格模式禁用的情况下,诸如"2018-02-31"这样的无效日期会被转换为'0000-00-00‘并产生警告,如果启用了严格模式,这样的无效日期会产生错误。
SQL模式的组合
  以下模式是对上述SQL模式完整列表中的部分组合的缩写
名称完整列表ANSIREAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,和 (在MySQL 5.7.5) ONLY_FULL_GROUP_BYDB2PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONSMSSQLPIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONSPOSTGRESQLPIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONSORACLEPIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USERMAXDBPIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USERTRADITIONALSTRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,  NO_ENGINE_SUBSTITUTION

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-613602-1-1.html 上篇帖子: show profiles 查看MySQL语句的执行时间 下篇帖子: MySQL-5.7主从搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表