國(guó)產(chǎn)數(shù)據(jù)庫兼容過程中涉及的MySQL非嚴(yán)格模式
在國(guó)產(chǎn)數(shù)據(jù)庫兼容適配過程中,經(jīng)常遇到因源數(shù)據(jù)庫是MySQL,遷移至其他國(guó)產(chǎn)數(shù)據(jù)庫后,因MySQL端兼容模式有非嚴(yán)格模式,導(dǎo)致適配過程過程中需要做調(diào)整。那么,MySQL主要的非嚴(yán)格模式小結(jié)如下:
1、非嚴(yán)格模式參數(shù)
MySQL的非嚴(yán)格模式指的是在MySQL配置中禁用嚴(yán)格模式(Strict Mode)的情況下執(zhí)行的SQL。在非嚴(yán)格模式下,MySQL會(huì)對(duì)某些數(shù)據(jù)插入、更新和比較操作執(zhí)行隱式轉(zhuǎn)換,從而在一些情況下允許執(zhí)行一些寬松的操作,而不拋出錯(cuò)誤或警告。
涉及的主要參數(shù)說明如下:
a) STRICT_TRANS_TABLES:在插入或更新數(shù)據(jù)時(shí),禁止自動(dòng)轉(zhuǎn)換類型,確保所有數(shù)據(jù)都符合表定義的數(shù)據(jù)類型范圍。如果值無法轉(zhuǎn)換為合法的數(shù)據(jù)類型,則拋出錯(cuò)誤。
b) STRICT_ALL_TABLES:對(duì)所有表都啟用STRICT_TRANS_TABLES模式,確保數(shù)據(jù)插入或更新時(shí)嚴(yán)格符合表定義的數(shù)據(jù)類型。
c) NO_ZERO_IN_DATE:禁止在日期中使用零值,例如'0000-00-00',在嚴(yán)格模式下會(huì)被視為非法日期。
d) NO_ZERO_DATE:禁止使用零值表示日期的部分,例如'2000-00-00',在嚴(yán)格模式下會(huì)被視為非法日期。
e) ERROR_FOR_DIVISION_BY_ZERO:當(dāng)除數(shù)為零時(shí),拋出錯(cuò)誤而不是返回NULL。
f) ANSI_QUOTES:?jiǎn)⒂肁NSI_QUOTES模式,要求使用雙引號(hào)來引用字符串,而不是MySQL默認(rèn)的單引號(hào)。
g) NO_AUTO_CREATE_USER:禁止在GRANT語句中自動(dòng)創(chuàng)建新用戶。
h) NO_ENGINE_SUBSTITUTION:如果指定的存儲(chǔ)引擎不可用,不允許MySQL使用默認(rèn)的存儲(chǔ)引擎替代。
2、簡(jiǎn)單舉例
以下是一些非嚴(yán)格模式下可能出現(xiàn)的案例情況:
非嚴(yán)格的日期和時(shí)間插入:在非嚴(yán)格模式下,MySQL允許插入不符合日期和時(shí)間格式的值,會(huì)自動(dòng)進(jìn)行轉(zhuǎn)換或舍入
eg: 不合法的日期值'0000-00-00'等
非嚴(yán)格的字符串插入:在非嚴(yán)格模式下,MySQL允許插入過長(zhǎng)的字符串,會(huì)自動(dòng)截?cái)喑^字段長(zhǎng)度的部分 (建議已開啟此類嚴(yán)格模式)
eg: varchar(2) 類型的字段,插入ABC可以成功,插入結(jié)果為AB
非嚴(yán)格的數(shù)值插入:在非嚴(yán)格模式下,MySQL允許插入超出字段范圍的數(shù)值,會(huì)自動(dòng)進(jìn)行范圍調(diào)整(建議已開啟此類嚴(yán)格模式)
eg: TINYINT(默認(rèn)最大127) 可以插入150,且插入后的值自動(dòng)截?cái)酁?127
非嚴(yán)格的零值插入:在非嚴(yán)格模式下,MySQL允許插入字符串類型的值到數(shù)值類型字段,會(huì)將非數(shù)值字符串轉(zhuǎn)換為0 (建議已開啟此類嚴(yán)格模式)
eg: 例如可以將字符串'123' 插入int類型,結(jié)果是123;將'abc'插入int,結(jié)果是0
非嚴(yán)格的分組查詢:在非嚴(yán)格模式下,MySQL允許在GROUP BY查詢中選擇非聚合列,這可能導(dǎo)致不確定的結(jié)果
eg: SELECT a,b,COUNT(*) FROM tb GROUP BY a
非嚴(yán)格的NULL值比較:在非嚴(yán)格模式下,MySQL允許使用普通比較運(yùn)算符(如=、<、>等)與NULL值進(jìn)行比較,這可能導(dǎo)致不確定的結(jié)果 (建議已開啟此類嚴(yán)格模式)
eg: column_name =NULL 或者 column_name <> NULL
非嚴(yán)格的外鍵約束:在非嚴(yán)格模式下,MySQL對(duì)外鍵約束的檢查較為寬松,可能會(huì)允許插入或更新關(guān)聯(lián)字段中不存在的值。(建議已開啟此類嚴(yán)格模式)
eg: tb表外鍵字段指向ta表的主鍵,如果tb表的外鍵字段插入的內(nèi)容不存在于a表中時(shí)也可以寫入成功
非嚴(yán)格的除數(shù)為0校驗(yàn):在非嚴(yán)格模式下,MySQL允許除數(shù)為0
eg: 10/0 ,結(jié)果為null
非嚴(yán)格的字符串引號(hào)標(biāo)識(shí):在非嚴(yán)格模式下,MySQL允許單引號(hào)及雙引號(hào)來引用字符串
eg: 'abc' 或 "abc"均可
非嚴(yán)格的grant模式自動(dòng)創(chuàng)建用戶:在非嚴(yán)格模式下,MySQL允許grant語句中如果用戶不存在時(shí)自動(dòng)創(chuàng)建用戶
eg: grant select on db1)tb1 to test;
非嚴(yán)格的存儲(chǔ)引擎自動(dòng)替代: 在非嚴(yán)格模式下,MySQL允許指定的存儲(chǔ)引擎不可用是使用默認(rèn)的存儲(chǔ)引擎替代
eg: create table tb2(id int primary key ) engin = aaa;
PS:還會(huì)有其他的非嚴(yán)格模式的組合以及不同數(shù)據(jù)庫的兼容模式情況,大家可以繼續(xù)探索。