MySQL的SQL_Mode修改小計


問題復現

今天突然發現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> 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM