什么是sql_mode?
sql_mode是MySQL數(shù)據(jù)庫的一個(gè)設(shè)置,它影響了數(shù)據(jù)庫在處理SQL語句時(shí)的一些行為方式。最新的MySQL 5.7版本中,sql_mode被重構(gòu)為一個(gè)包含多個(gè)子項(xiàng)的列表。每個(gè)子項(xiàng)會(huì)影響數(shù)據(jù)庫在不同方面的行為。
什么是sql_mode = "STRICT_TRANS_TABLES"?
在MySQL 5.7版本中,sql_mode="STRICT_TRANS_TABLES"是默認(rèn)開啟的。它的主要作用是對(duì)于任何不符合完整性約束的語句(例如非空字段賦值NULL),都會(huì)導(dǎo)致查詢錯(cuò)誤,并且不允許這些語句進(jìn)行提交和執(zhí)行。
sql_mode = "ONLY_FULL_GROUP_BY"
sql_mode="ONLY_FULL_GROUP_BY"是發(fā)現(xiàn)錯(cuò)誤的好方法。在MySQL 5.7版本中,這個(gè)配置項(xiàng)開啟后,只有GROUP BY子句中列出的列或者聚合函數(shù)的聚合結(jié)果才可以用于SELECT查詢返回。假如GROUP BY中包含其他的列并且沒有用于計(jì)算聚合結(jié)果,MySQL將會(huì)報(bào)錯(cuò)。
sql_mode = "NO_ZERO_DATE"
有時(shí)候我們可能會(huì)錯(cuò)誤地插入'0000-00-00'等非法日期,雖然MySQL在某些情況下能夠接受該日期,但實(shí)際上這個(gè)日期是不存在的。開啟sql_mode="NO_ZERO_DATE"后,MySQL將禁止插入非法日期,同時(shí)也禁止在更新操作中將該日期更新為NULL值。
sql_mode = "ERROR_FOR_DIVISION_BY_ZERO"
在MySQL 5.7版本中,sql_mode="ERROR_FOR_DIVISION_BY_ZERO"表示如果除數(shù)為0時(shí),直接返回一個(gè)錯(cuò)誤。如果沒有開啟此功能,MySQL會(huì)返回NULL或0,因此開啟該功能可以更準(zhǔn)確地發(fā)現(xiàn)應(yīng)用程序中對(duì)于除數(shù)為0的錯(cuò)誤。