一. sql_mode的作用:
sql_mode直接影響到SQL語法檢查條件
二. 關(guān)于Mysql 的版本:
Mysql 5.7支持的MODE有:[ONLY_FULL_GROUP_BY
], [STRICT_TRANS_TABLES
], [NO_ZERO_IN_DATE
], [NO_AUTO_CREATE_USER
],[NO_ZERO_DATE
],[ERROR_FOR_DIVISION_BY_ZERO
], [NO_ENGINE_SUBSTITUTION
]
其中[ONLY_FULL_GROUP_BY
],[STRICT_TRANS_TABLES
]是v5.7.5豫尽,
[NO_AUTO_CREATE_USER
]是v5.7.7,[ERROR_FOR_DIVISION_BY_ZERO
], [NO_ENGINE_SUBSTITUTION
]是v5.7.8新增
5.6.6 以后版本默認(rèn)就是[NO_ENGINE_SUBSTITUTION
],[STRICT_TRANS_TABLES
]
5.5~5.6.5 均默認(rèn)為 ‘’
三. 如何設(shè)置
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
可通過
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
查看當(dāng)前的全局設(shè)置或者session mode值
注意:1. 主從數(shù)據(jù)表該值最好保持一致犹芹;2. 若存在分表恢口,修改該值有風(fēng)險(xiǎn)
四. 最重要最常用的幾個(gè)MODE值
1.ANSI:更改語法和行為唧喉,使其更符合標(biāo)準(zhǔn)SQL
相當(dāng)于REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
- STRICT_TRANS_TABLES:存在部分失敗則拋出錯(cuò)誤呆躲,強(qiáng)制全部失敗
- TRADITIONAL:存在錯(cuò)誤時(shí)給出錯(cuò)誤而非警告
- ONLY_FULL_GROUP_BY:對(duì)于GROUP BY聚合操作异逐,如果在SELECT中的列、HAVING或者ORDER BY子句的列插掂,沒有在GROUP BY中出現(xiàn)灰瞻,那么這個(gè)SQL是不合法的,在5.7中默認(rèn)啟用辅甥。
五. 關(guān)于STRICT_TRANS_TABLES
- 無論何種mode酝润,產(chǎn)生error之后就意味著單條sql執(zhí)行失敗,對(duì)于支持事務(wù)的表璃弄,失敗回滾要销;但如果沒有放在事務(wù)中執(zhí)行或者不支持事務(wù)的存儲(chǔ)引擎表,則可能導(dǎo)致數(shù)據(jù)不一致夏块;
- MySQL認(rèn)為疏咐,相比直接報(bào)錯(cuò)終止,數(shù)據(jù)不一致問題更嚴(yán)重脐供;
- STRICT_TRANS_TABLES 和STRICT_ALL_TABLES對(duì)事務(wù)都是strict_mode浑塞,失敗中止操作,存在部分更新的情況政己;
- STRICT_TRANS_TABLES對(duì)非事務(wù)表依然盡可能的讓寫入繼續(xù)缩举,比如給個(gè)”最合理”的默認(rèn)值或截?cái)?/li>