共計 2525 個字符,預計需要花費 7 分鐘才能閱讀完成。
這篇文章主要介紹了 MySQL5.6 中 sql_mode 常用值的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。
SQL Mode 定義了兩個方面:MySQL 應支持的 SQL 語法,以及應該在數(shù)據(jù)上執(zhí)行何種確認檢查。
SQL 語法支持類
ONLY_FULL_GROUP_BY
對于 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,沒有在 GROUP BY 中出現(xiàn),那么這個 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 后,不能用雙引號來引用字符串,因為它被解釋為識別符,作用與 ` 一樣。
設(shè)置它以后,update t set f1= …,會報 Unknown column‘’in‘field list 這樣的語法錯誤。
PIPES_AS_CONCAT
將 || 視為字符串的連接操作符而非 或 運算符,這和 Oracle 數(shù)據(jù)庫是一樣的,也和字符串的拼接函數(shù) CONCAT() 相類似
NO_TABLE_OPTIONS
使用 SHOW CREATE TABLE 時不會輸出 MySQL 特有的語法部分,如 ENGINE,這個在使用 mysqldump 跨 DB 種類遷移的時候需要考慮。
NO_AUTO_CREATE_USER
字面意思不自動創(chuàng)建用戶。在給 MySQL 用戶授權(quán)時,我們習慣使用 GRANT … ON … TO dbuser 順道一起創(chuàng)建用戶。設(shè)置該選項后就與 oracle 操作類似,
授權(quán)之前必須先建立用戶。5.7.7 開始也默認了。
數(shù)據(jù)檢查類
NO_ZERO_DATE
認為日期‘0000-00-00’非法,與是否設(shè)置后面的嚴格模式有關(guān)。
1. 如果設(shè)置了嚴格模式,則 NO_ZERO_DATE 自然滿足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然允許且只顯示 warning
2. 如果在非嚴格模式下,設(shè)置了 NO_ZERO_DATE,效果與上面一樣,’0000-00-00’允許但顯示 warning;如果沒有設(shè)置 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 時,那么直接拋出錯誤;不設(shè)置此值時,CREATE 用默認的存儲引擎替代,ATLER 不進行更改,并拋出一個 warning .
STRICT_TRANS_TABLES
設(shè)置它,表示啟用嚴格模式。
注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨指 INSERT、UPDATE 出現(xiàn)少值或無效值該如何處理:
1. 前面提到的把‘’傳給 int,嚴格模式下非法,若啟用非嚴格模式則變成 0,產(chǎn)生一個 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 一般來說很少去關(guān)注它,沒有遇到實際問題之前不會去啟停上面的條目。我們常設(shè)置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ansi 和 traditional 是上面的幾種組合。
ANSI:更改語法和行為,使其更符合標準 SQL
相當于 REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
TRADITIONAL:更像傳統(tǒng) SQL 數(shù)據(jù)庫系統(tǒng),該模式的簡單描述是當在列中插入不正確的值時“給出錯誤而不是警告”。
相當于 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,產(chǎn)生 error 之后就意味著單條 sql 執(zhí)行失敗,對于支持事務(wù)的表,則導致當前事務(wù)回滾;但如果沒有放在事務(wù)中執(zhí)行,或者不支持事務(wù)的存儲引擎表,則可能導致數(shù)據(jù)不一致。MySQL 認為,相比直接報錯終止,數(shù)據(jù)不一致問題更嚴重。于是 STRICT_TRANS_TABLES 對非事務(wù)表依然盡可能的讓寫入繼續(xù),比如給個”最合理”的默認值或截斷。而對于 STRICT_ALL_TABLES,如果是單條更新,則不影響,但如果更新的是多條,第一條成功,后面失敗則會出現(xiàn)部分更新。
感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“MySQL5.6 中 sql_mode 常用值的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關(guān)注丸趣 TV 行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!