mysql sql_mode 详解_五、被 MySQL sql_mode 深深伤害( 下 )
當我們要重新設置 MySQL sql_mode 的時候,可能看到那一串長長的列表就會患頭痛病,這哪個是哪個啊,哪個是重要的啊?哪個是可以缺少的啊?
我們就會想要呼喚一個簡單的版本,要是有三個特殊的 sql_mode 分別表示寬松、標準、嚴格那該多好,出現 sql_mode 問題的時候就先設置寬松版本
MySQL 也考慮到了這個問題,所以在 5.0 以后的版本中新增加了三個特殊的 sql_mode
sql_mode
說明
ANSI
寬松模式,對于大部分的 sql 語句按照古老的模式執行成功,但會拋出一個警告
TRADITIONAL
算是標準模式吧,這種模式下有些 sql 語句就會直接出錯
STRICT_TRANS_TABLES
嚴格模式,這種模式下只要一條 SQL 語句出錯就會直接中斷事務的執行
而設置這三種模式的語法也很簡單
1、設置當前連接的 sql_mode
set @@sql_mode=TRADITIONAL;
set @@sql_mode=STRICT_TRANS_TABLES;
set @@sql_mode=ANSI;
2、設置全局的 sql_mode
set global @@sql_mode=TRADITIONAL;
set global @@sql_mode=STRICT_TRANS_TABLES;
set global @@sql_mode=ANSI;
3、持久化設置,也就是更改 my.cnf 文件
[mysqlnd]
sql_mode=TRADITIONAL
sql_mode=STRICT_TRANS_TABLES
sql_mode=ANSI
對了,三者你只能選擇一個
對于我們前面提到的 timestamp 默認值 0 錯誤等,可以直接使用 ANSI 模式,這樣便可以插入數據,而對于除數為0的結果的字段值,數據庫將會用 NULL 值代替
剛剛我們不是說了這三種特殊的模式是一些其它模式的結合體嗎?我們下面就來看看它們包括哪些具體的 sql_mode
1、ANSI
相當于
REAL_AS_FLOAT
PIPES_AS_CONCAT
ANSI_QUOTES
IGNORE_SPACE
ONLY_FULL_GROUP_BY
注意,還是包含了 ONLY_FULL_GROUP_BY
2、STRICT_TRANS_TABLES
它不是一個結合體,而是一個單獨體,在這個模式下,會進行數據的嚴格校驗,錯誤數據不能插入,報 error 錯誤
如果不能將給定的值插入到事務表中,則放棄該語句
對于非事務表,如果值出現在單行語句或多行語句的第1行,則放棄該語句
3、TRADITIONAL
相當于
STRICT_TRANS_TABLES
STRICT_ALL_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
NO_ENGINE_SUBSTITUTION
注意,包含了 STRICT_TRANS_TABLES
時間有限,這一章節我們先講到這里,我覺得 sql_mode 還是看官方的文檔來的最好
干貨推薦
附錄:MySQL 拾遺:系列文章
總結
以上是生活随笔為你收集整理的mysql sql_mode 详解_五、被 MySQL sql_mode 深深伤害( 下 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强跟踪ukf matlab,st-ekf
- 下一篇: deepin安装anaconda