MySQL的SQL_Mode修改小計

問題復現

今天忽然發現MySQL服務器升級以後sql_mode變成寬鬆摸索了,危害以下:
mysql

臨時解決

set global sql_mode='strict_trans_tables'(阿里服務器默認是:strict_trans_tables
sql

重啓失效驗證

上面這種方式在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> set global sql_mode='xx_mode'
      • mysql> set @@global.sql_mode='xx_mode'
      • PS: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權限)
    • 經常使用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
相關文章
相關標籤/搜索