1. 程式人生 > >16.Mysql SQL Mode

16.Mysql SQL Mode

存儲 數據校驗 ash 轉義字符 其余 mysql5 pre ssi value

16.SQL Mode及相關問題
SQL Mode定義了Mysql支持的SQL語法和數據校驗級別,Mysql支持多種SQL Mode。
用途:
設置不同的SQL Mode可以對數據進行不同嚴格程度的校驗,即在不同應用環境提供不同的數據質量;
設置不同的SQL Mode可以方便數據遷移至目標數據庫;
ANSI模式可以保證大多數SQL符合SQL標準語法,方便應用在不同數據庫上遷移。
16.1 Mysql SQL Mode簡介
1.查看當前SQL Mode
select @@sql_mode;
2.修改SQL Mode
語法:
set [session|global] sql_mode=‘sql模式名‘;
說明:

session 只對當前會話有效,其余會話無效;
global 對所有新會話有效,mysql重啟後失效;
在my.cnf文件中設置sql_mode=‘sql模式名‘ 持久有效。

16.2 SQL Mode的常見功能
sql模式分為模式組和原子模式,模式組由固定的原子模式組成,多個原子模式與多個原子模式或多個模式組可以自由組合。
原子模式包括:
REAL_AS_FLOAT : REAL 為 FLOAT 的同義詞(默認情況, REAL 為 DOUBLE 的同義詞).
PIPES_AS_CONCAT :管道符(||) 作為連接符.(默認使用函數 CONCAT 連接字符)
ANSI_QUOTES : 標準引號, 雙引號不作為字符串引號,作為關鍵字標識符引號

IGNORE_SPACE :對於內置函數與其他字符間的空格,忽略空格
ONLY_FULL_GROUP_BY(MySQL 5.7.5) select 非group by列報錯。聚合語句安裝標準寫法,如 oracle sqlserver 一樣。
NO_ZERO_IN_DATE :警告,日期格式(月日)是‘00‘
NO_ZERO_DATE :警告,日期格式是 ‘0000-00-00‘
ERROR_FOR_DIVISION_BY_ZERO :警告,除數為0
NO_AUTO_CREATE_USER 禁止使用 GRANT 創建密碼為空的用戶。
NO_ENGINE_SUBSTITUTION :默認情況創建或修改表的存儲引擎不支持時,自動轉為默認的INNODB;使用該模式後,存儲引擎不支持時則報錯。
ALLOW_INVALID_DATES :警告,檢查日期格式合法性(DATE 或 DATETIME, 非 TIMESTAMP )
NO_AUTO_VALUE_ON_ZERO :運行序列中插入 "0",如果 id 不約束唯一, 可插入多個。插入 NULL 值默認都會自增。
HIGH_NOT_PRECEDENCE :未使用模式 HIGH_NOT_PRECEDENCE, "not id between 2 and 4" 相當於 "not (id between 2 and 4)";使用模式 HIGH_NOT_PRECEDENCE, "not id between 2 and 4" 相當於 "(not id) between 2 and 4".
NO_BACKSLASH_ESCAPES :反斜杠"\"為普通字符而不是轉義字符。
NO_UNSIGNED_SUBTRACTION : UNSIGNED 類型如果得到一個負值,則報錯。(盡量不要 UNSIGNED)
PAD_CHAR_TO_FULL_LENGTH :對於 char、nchar 類型,默認以空字符填充,查詢時自動去掉空字符。啟用該模式後,查詢時空字符保留。
NO_DIR_IN_CREATE :創建表分區時,忽略命令 INDEX DIRECTORY 和 DATA DIRECTORY。用於副本示例中的選項。

16.3 常用的SQL Mode
固定模式組分為:
ANSI 非嚴格模式:數據長超、非法日期不會報錯
REAL_AS_FLOAT : REAL 為 FLOAT 的同義詞(默認情況, REAL 為 DOUBLE 的同義詞).
PIPES_AS_CONCAT :管道符(||) 作為連接符.(默認使用函數 CONCAT 連接字符)
ANSI_QUOTES : 標準引號, 雙引號不作為字符串引號,作為關鍵字標識符引號
IGNORE_SPACE :對於內置函數與其他字符間的空格,忽略空格
ONLY_FULL_GROUP_BY(MySQL 5.7.5)
STRICT_TRANS_TABLES :對事務型表操作,插入表時如果第一行數據不符合約束則終止執行並回滾。
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
TRADITIONAL 嚴格模式:非法日期、除數為0、數據超長 報錯
STRICT_TRANS_TABLES :對事務型表操作,插入表時如果第一行數據不符合約束則終止執行並回滾。
STRICT_ALL_TABLES
NO_ZERO_IN_DATE:
NO_ZERO_DATE:
ERROR_FOR_DIVISION_BY_ZERO:除數為0報錯
NO_AUTO_CREATE_USER:
NO_ENGINE_SUBSTITUTION

16.4 SQL Mode在遷移中如何使用
POSTGRESQL\DB2\MSSQL
PIPES_AS_CONCAT
ANSI_QUOTES
IGNORE_SPACE
NO_KEY_OPTIONS
NO_TABLE_OPTIONS :建表語句不包括engine
NO_FIELD_OPTIONS
ORACLE\MAXDB
PIPES_AS_CONCAT
ANSI_QUOTES
IGNORE_SPACE
NO_KEY_OPTIONS
NO_TABLE_OPTIONS
NO_FIELD_OPTIONS
NO_AUTO_CREATE_USER 禁止使用 GRANT 創建密碼為空的用戶。
NO_BACKSLASH_ESCAPES : 將\視為普通字符

16.5 小結
mysql5.7 默認模式:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION,
5.7.4 廢棄:ERROR_FOR_DIVISION_BY_ZERO
5.7.5 默認:ONLY_FULL_GROUP_BY , STRICT_TRANS_TABLES
5.7.7 默認:NO_AUTO_CREATE_USER
5.7.8 默認:ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE

NO_AUTO_CREATE_USER 禁止使用 GRANT 創建密碼為空的用戶。
標準寫法:
create user user01@‘localhost‘ identified by ‘user01‘;
grant all on test.* to user01@‘localhost‘;
flush privileges;

16.Mysql SQL Mode