下則為河岳,上則為日星
查詢當前sql_mode
SELECT @@sql_mode
幾種sql_mode模式介紹
sql_mode模式是具體的幾種 sql_mode值的集合烛亦,我們可以直接指定這個來方便達到使用多種sql_mode值的目的
ANSI模式
寬松模式盒使,對插入數(shù)據(jù)進行校驗捣作,如果不符合定義類型或長度衣摩,對數(shù)據(jù)類型調整或截斷保存卜录,報warning警告戈擒。
SET SESSION sql_mode = 'ANSI';
SET GLOBAL sql_mode = 'ANSI';
TRADITIONAL模式
嚴格模式,當向mysql數(shù)據(jù)庫插入數(shù)據(jù)時艰毒,進行數(shù)據(jù)的嚴格校驗筐高,保證錯誤數(shù)據(jù)不能插入,報error錯誤。用于事物時凯傲,會進行事物的回滾犬辰。
SET SESSION sql_mode = 'TRADITIONAL';
SET GLOBAL sql_mode = 'TRADITIONAL';
STRICT_TRANS_TABLES模式
嚴格模式,進行數(shù)據(jù)的嚴格校驗冰单,錯誤數(shù)據(jù)不能插入幌缝,報error錯誤。
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';
ORACLE模式
SET SESSION sql_mode = 'ORACLE';
SET GLOBAL sql_mode = 'ORACLE';
PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
MSSQL模式(sql server)
SET SESSION sql_mode = 'MSSQL';
SET GLOBAL sql_mode = 'MSSQL';
PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,MSSQL,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS
具體sql mode的值
ANSI
1诫欠、REAL_AS_FLOAT
將real視為float的同義詞涵卵。默認情況下,mysql將real視為double的同義詞荒叼。
2轿偎、PIPES_AS_CONCAT
將||
符號視為字符串連接操作符
3、ANSI_QUOTES
將"
視為標識符引用字符(如""
引用字符),而不是字符串引用字符被廓。啟用此模式后坏晦,您仍然可以使用`來引用標識符。啟用ansi_quotes后嫁乘,不能使用雙引號來引用文字字符串昆婿,因為它們被解釋為標識符。
舉個例子:若沒有指定ansi_quotes蜓斧,則可以這樣 SELECT "11" ,這里將雙引號內容被認為是字符串仓蛆,查詢會成功執(zhí)行;若指定了ansi_quotes挎春,則該查詢報錯看疙。因為此時內容被認為是 字段名(類似于``)
4、IGNORE_SPACE
允許函數(shù)名和(字符)之間有空格直奋。這導致內置函數(shù)名被視為保留字
5能庆、ONLY_FULL_GROUP_BY
對于GROUP BY聚合操作,如果在SELECT中的列脚线,沒有在GROUP BY中出現(xiàn)相味,那么將認為這個SQL是不合法的,因為列不在GROUP BY從句中
TRADITIONAL
1殉挽、STRICT_TRANS_TABLES
為事務引擎啟用嚴格的sql模式,并盡量為非事務引擎啟用
2拓巧、STRICT_ALL_TABLES
為所有的存儲引擎啟用嚴格的sql模式
3斯碌、NO_ZERO_IN_DATE
在嚴格模式,不接受月或日部分為0的日期肛度。如果使用IGNORE選項傻唾,我們?yōu)轭愃频娜掌诓迦?0000-00-00'。在非嚴格模式,可以接受該日期冠骄,但會生成警告伪煤。
4、NO_ZERO_DATE
在嚴格模式凛辣,不要將 '0000-00-00'做為合法日期抱既。你仍然可以用IGNORE選項插入零日期。在非嚴格模式扁誓,可以接受該日期防泵,但會生成警告
5、ERROR_FOR_DIVISION_BY_ZERO
在嚴格模式蝗敢,在INSERT或UPDATE過程中捷泞,如果被零除(或MOD(X,0))寿谴,則產生錯誤(否則為警告)锁右。如果未給出該模式,被零除時MySQL返回NULL讶泰。如果用到INSERT IGNORE或UPDATE IGNORE中咏瑟,MySQL生成被零除警告,但操作結果為NULL峻厚。
6响蕴、NO_AUTO_CREATE_USER
防止GRANT自動創(chuàng)建新用戶,除非還指定了密碼惠桃。
7浦夷、NO_ENGINE_SUBSTITUTION
如果需要的存儲引擎被禁用或未編譯,那么拋出錯誤辜王。不設置此值時劈狐,用默認的存儲引擎替代,并拋出一個異常呐馆。
其它的
1肥缔、PAD_CHAR_TO_FULL_LENGTH
默認情況下,檢索時從char列值中刪除尾隨空格汹来。如果啟用了pad_char_to_full_length续膳,則不會發(fā)生調整,檢索到的char值會被填充到其全長收班。此模式不適用于varchar列坟岔,檢索時會為這些列保留尾隨空格。
2摔桦、NO_KEY_OPTIONS
不要在show create表的輸出中打印mysql特定的索引選項
3社付、NO_TABLE_OPTIONS
不要在show create table的輸出中打印mysql特定的表選項(如engine
),由此獲得更加通用的腳本
4、NO_FIELD_OPTIONS
不要在show create表的輸出中打印mysql特定的列選項
sql_mode在數(shù)據(jù)遷移中的應用
如果mysql 與其它異構數(shù)據(jù)庫之間有數(shù)據(jù)遷移的需求時鸥咖,那么mysql中提供的數(shù)據(jù)庫組合模式則會對數(shù)據(jù)遷移過程會有所幫助燕鸽。對導出數(shù)據(jù)更容易導入目標。
1啼辣、 通過設置sql mode, 可以完成不同嚴格程度的數(shù)據(jù)校驗啊研,有效地保障數(shù)據(jù)準備性。
2熙兔、 通過設置sql model 為ansi 模式悲伶,來保證大多數(shù)sql符合標準的sql語法,這樣應用在不同數(shù)據(jù)庫之間進行遷移時住涉,則不需要對業(yè)務sql 進行較大的修改麸锉。
3、 在不同數(shù)據(jù)庫之間進行數(shù)據(jù)遷移之前舆声,通過設置SQL Mode 可以使MySQL 上的數(shù)據(jù)更方便地遷移到目標數(shù)據(jù)庫中花沉。
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
修改配置的方式
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION