1.SQL Mode解決的問題:
a.經過設置SQL Mode , 能夠完成不一樣嚴格程度的數據校驗,有效地保障數據準確性.
b.經過設置SQL Mode 爲ANSI模式,來保證大多數SQL符合標準的SQL語法,應用在不一樣數據庫之間遷移時,對業務SQL進行的修改較小.
2.MySQL SQL Mode
MySQL5.0上,默認SQL Mode(參數)爲: REAL_AS_FLOAT , PIPES_AS_CONCAT, ANSI_QUOTES , GNORE_SPACE , ANSI .
這種模式下,容許插入超過字段長度的值,只是在插入後,MySQL會返回一個Warning.
經過修改SQL Mode 爲 STRICT_TRANS_TABLES(嚴格模式),進行嚴格的數據校驗,使得錯誤數據不能插入表中,從而保證數據的準確性.
1).查看SQL Mode 命令
SELECT @@sql_mode ;
2).設置SQL Mode
SET [SESSION|GLOBAL] sql_mode = 'xx_mode' ;
其中,SESSION : 只在本次鏈接中生效;
GLOBAL : 表示本次鏈接不生效,而對於新的鏈接則生效.
另外能夠在MySQL啓動時,經過 --sql-mode="xx_mode" 來設置SQL Mode ;
3.SQL Mode 常見功能
1).校驗日期的合法性
嚴格模式下 , 若是不合法,則報錯;例如4月沒有31日,這樣的數據沒法插入.
非嚴格模式下, 會插入一條 0000-00-00 00:00:00 的數據
2).INSERT/UPDATE過程當中
嚴格模式下 MOD(x,0) 這種會報錯;
非嚴格模式下 會插入 null
3).NO_BACKSLASH_ESCAPES 模式
導入數據時,若是數據中含有反斜線字符,啓用NO_BACKSLASH_ESCAPES模式來保證數據的正確性,是個不錯的選擇.
4).PIPES_AS_CONCAT模式
其餘數據庫,如Oracle使用 || 做爲字符串鏈接符,這樣的SQL正常狀況下在 MySQL中沒法執行, 爲了解決這個問題 , MySQL 提供了 PIPES_AS_CONCAT 模式.
4.經常使用的SQL Mode
1).ANSI
等同於 REAL_AS_FLOAT , PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE 和ANSI組合模式 , 使語法和行爲更符合標準SQL.
2).STRICT_TRANS_TABLES
嚴格模式
3)TRADITIONAL
等同於 STRICT_TRANS_TABLES , STRICT_ALL_TABLES , NO_ZERO_IN_DATE , NO_ZERO_DATE , ERROR_FOR_DIVISION_BY_ZERO , TRADITIONAL , NO_AUTO_CREATE_USER 組合模式 , 因此它也是嚴格模式.
4.SQL Mode 在數據遷移中的使用
1) 各類異構數據庫在MySQL中的SQL Mode組合
DB2 |
PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , NO_KEY_OPTIONS , NO_TABLE_OPTIONS , NO_FIELD_OPTIONS |
MAXDB |
PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , NO_KEY_OPTIONS , NO_TABLE_OPTIONS , NO_FIELD_OPTIONS , NO_AUTO_CREATE_USER |
MSSQL |
PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , NO_KEY_OPTIONS , NO_TABLE_OPTIONS , NO_FIELD_OPTIONS |
ORACLE |
PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , NO_KEY_OPTIONS , NO_TABLE_OPTIONS , NO_FIELD_OPTIONS , NO_AUTO_CREATE_USER |
POSTGRESQL |
PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE , NO_KEY_OPTIONS , NO_TABLE_OPTIONS , NO_FIELD_OPTIONS |
NO_TABLE_OPTIONS : 能夠去掉建表語句中的 table options, 例如engine的設置, 這種模式下 , 能夠得到通用的建表腳本.