問題復現
今天突然發現MySQL服務器升級之后sql_mode變成寬松摸索了,危害如下:

臨時解決
set global sql_mode='strict_trans_tables'(阿里服務器默認是:strict_trans_tables)

重啟失效驗證
上面這種方式在MySQL重啟后就會失效,想要永久生效還得聯系運維工程師,eg:

配置文件
PS:為了防止再出現升級后SQL_Mode改變,以后在配置文件中設置SQL_Mode


知識點
SQL Model:定義MySQL對約束的響應行為:- 會話修改:
- mysql>
set [session] sql_model='xx_mode' - mysql>
set @@session.sql_mode='xx_mode' - PS:只在當前會話生效
- mysql>
- 全局修改:需要有權限,並且不會立即生效,對以后新建的會話生效(從全局繼承的)
- mysql>
set global sql_mode='xx_mode' - mysql>
set @@global.sql_mode='xx_mode' - PS:MySQL重啟后失效
- mysql>
- 配置修改:永遠生效:
- eg:
vi /etc/my.cnf,在[mysqld]下添加sql_mode='xx',然后重啟數據庫 - PS:從MySQL8開始,可通過
set persist命令將全局變量的修改持久化到配置文件中- 持久化到
/var/lib/mysql/mysqld-auto.cnf配置文件中 - eg:
set persist log_timestamps='SYSTEM';(需要root權限)
- 持久化到
- eg:
- 常用mode:(阿里服務器默認是:
strict_trans_tables)traditional:使用傳統模型,不允許對非法值做插入操作strict_all_tables:對所有表做嚴格約束strict_trans_tables:對所有支持事物類型的表做嚴格約束:- PS:最常見,主要對事物型的存儲引擎生效,其他的沒效果(如果插入數據不符合規范,則中斷當前操作)
no_engine_substitution:建表的時候指定不可用存儲引擎會報錯only_full_group_by:檢驗group by語句的合法性- 要求在在分組查詢語句中,把所有沒有使用聚合函數的列,列出來
- eg:
select count(url),name from file_records group by url;- 使用了name字段,name不是聚合函數,那必須在group by中寫一下
- PS:生存環境下最好不要修改,容易報錯對業務產生影響(嚴格變寬松沒事)
- 查詢當前設置:
select @@sql_mode
- 會話修改:
