MySQL5.6中sql

40次阅读
没有评论

共计 2525 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要介绍了 MySQL5.6 中 sql_mode 常用值的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

SQL Mode 定义了两个方面:MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查。

SQL 语法支持类

ONLY_FULL_GROUP_BY
对于 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,没有在 GROUP BY 中出现,那么这个 SQL 是不合法的。是可以理解的,因为不在 group by 的列查出来展示会有矛盾。
在 5.7 中默认启用,所以在实施 5.6 升级到 5.7 的过程需要注意:

1 Expression #1 of SELECT list is not in GROUP BY

2 clause and contains nonaggregated column

3 1066export.ebay_order_items.TransactionID which

4 is not functionally dependent on columns in GROUP BY

5 clause; this is incompatible with sql_mode=only_full_group_by
 

ANSI_QUOTES
启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符,作用与 ` 一样。
设置它以后,update t set f1= …,会报 Unknown column‘’in‘field list 这样的语法错误。

PIPES_AS_CONCAT
将 || 视为字符串的连接操作符而非 或 运算符,这和 Oracle 数据库是一样的,也和字符串的拼接函数 CONCAT() 相类似
NO_TABLE_OPTIONS
使用 SHOW CREATE TABLE 时不会输出 MySQL 特有的语法部分,如 ENGINE,这个在使用 mysqldump 跨 DB 种类迁移的时候需要考虑。
NO_AUTO_CREATE_USER
字面意思不自动创建用户。在给 MySQL 用户授权时,我们习惯使用 GRANT … ON … TO dbuser 顺道一起创建用户。设置该选项后就与 oracle 操作类似,
授权之前必须先建立用户。5.7.7 开始也默认了。

数据检查类
NO_ZERO_DATE
认为日期‘0000-00-00’非法,与是否设置后面的严格模式有关。
1. 如果设置了严格模式,则 NO_ZERO_DATE 自然满足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允许且只显示 warning
2. 如果在非严格模式下,设置了 NO_ZERO_DATE,效果与上面一样,’0000-00-00’允许但显示 warning;如果没有设置 NO_ZERO_DATE,no warning,当做完全合法的值。
3.NO_ZERO_IN_DATE 情况与上面类似,不同的是控制日期和天,是否可为 0,即 2010-01-00 是否合法。
NO_ENGINE_SUBSTITUTION
使用 ALTER TABLE 或 CREATE TABLE 指定 ENGINE 时,需要的存储引擎被禁用或未编译,该如何处理。启用 NO_ENGINE_SUBSTITUTION 时,那么直接抛出错误;不设置此值时,CREATE 用默认的存储引擎替代,ATLER 不进行更改,并抛出一个 warning .
STRICT_TRANS_TABLES
设置它,表示启用严格模式。
注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE 出现少值或无效值该如何处理:
1. 前面提到的把‘’传给 int,严格模式下非法,若启用非严格模式则变成 0,产生一个 warning
2.Out Of Range,变成插入最大边界值
3.A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition

sql_mode 一般来说很少去关注它,没有遇到实际问题之前不会去启停上面的条目。我们常设置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ansi 和 traditional 是上面的几种组合。
ANSI:更改语法和行为,使其更符合标准 SQL
相当于 REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
TRADITIONAL:更像传统 SQL 数据库系统,该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。
相当于 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
ORACLE:相当于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER

无论何种 mode,产生 error 之后就意味着单条 sql 执行失败,对于支持事务的表,则导致当前事务回滚;但如果没有放在事务中执行,或者不支持事务的存储引擎表,则可能导致数据不一致。MySQL 认为,相比直接报错终止,数据不一致问题更严重。于是 STRICT_TRANS_TABLES 对非事务表依然尽可能的让写入继续,比如给个”最合理”的默认值或截断。而对于 STRICT_ALL_TABLES,如果是单条更新,则不影响,但如果更新的是多条,第一条成功,后面失败则会出现部分更新。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MySQL5.6 中 sql_mode 常用值的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计2525字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)