與其它資料庫不同,MySQL 伺服器可以在不同的 SQL 模式下執行,並且可以針對不同的用戶端以不同的方式應用這些模式,具體取決於 sql_mode 系統變數的值。
SQL 模式定義了 MySQL 資料庫所支援的 SQL 語法和資料校驗(資料驗證檢查),這樣可以更容易的在不同環境下使用 MySQL。
在 MySQL 中,SQL 模式常用來解決下面幾類問題:
-
通過設定 SQL Mode,可以完成不同嚴格程度的資料校驗,有效地保障了資料的準確性。
-
通過設定 SQL Mode 為 ANSI 模式,可以保證大多數 SQL 符合標準的 SQL 語法,使不同資料庫之間進行遷移時,不需要進行較大的修改。
-
在不同資料庫之間進行資料遷移之前,設定 SQL Mode 可以使 MySQL 中的資料更方便地遷移到目標資料庫中。
sql_mode 系統變數的常用值
下面列出了幾種 SQL 模式常用的值。
1) TRICT_ ALL_TABLES 和 STRICT_ TRANS_TABLES
如果將 sql_mode 的值設定為 TRICT_ALL_TABLES 和 STRICT_TRANS_TABLES,那麼 MySQL將啟用“嚴格”模式。在嚴格模式下,MySQL 伺服器會更加嚴格地對待接收到的不合格資料,它不會把這些不合格的資料轉換為最為接近的有效值,而是會拒絕接收它們。
簡單來說 MySQL 的嚴格模式就是 MySQL 自身對資料進行的嚴格校驗,例如格式、長度和型別等。
2) TRADITIONAL
類似於嚴格模式,但是對於插入的不合格值會給出錯誤而不是警告。可以應用在事務表和非事務表,用於事務表時,只要出現錯誤就會立即回滾。
如果你使用的是非事務儲存引擎,建議不要把 SQL Mode 值設定為 TRADITIONAL,因為出現錯誤前進行的操作不會回滾,這樣會導致操作只進行了一部分。
3) ANSI_QUOTES
MySQL 伺服器會把雙引號識別為一個識別符號參照字元,而不是字串的引號字元。所以在啟用 ANSI_QUOTES 時,不能用雙引號來參照字串。
4) PIPES_ AS_ CONCAT
會讓 MySQL 伺服器把
||
當成一個標準的 SQL 字串連線運算子,而不會把它當成是 OR 運算子的同義詞。
在 Oracle 等資料庫中,
||
被視為字串的連線操作符,所以在其它資料庫中含有
||
操作符的 SQL 在 MySQL 中將無法執行,為了解決這個問題,MySQL 提供了這個值。
5) ANSI
會同時啟用 ANSI_QUOTES、PIPES_ AS_CONCAT 和其它的幾個模式值,使 MySQL 伺服器的行為比它的預設執行狀態更接近於標準 SQL。
如何設定 sql_mode
在設定 SQL 模式時,需要指定一個由單個模式值或多個模式值(多個模式值用逗號分隔)構成的值,或者指定一個空字串,用以清除該值。模式值不區分大小寫。
如果想在啟動伺服器時設定 SQL 模式,那麼可以在 mysqld 命令列,或者在某個選項檔案裡設定系統變數 sql_mode。可以使用下面語句:
sql_mode= "TRADITIONAL "
sql_mode= "ANSI_ QUOTES, PIPES_ AS_ CONCAT"
如果只是想在執行時更改 SQL 模式,那麼可以使用 SET 語句來設定 sql_mode 系統變數。
SET sql_mode = ' TRADITIONAL' ;
如果想設定全域性性的 SQL 模式,則需要加上 GLOBAL 關鍵字:
SET GLOBAL sql_mode = ' TRADITIONAL';
設定全域性變數需要具備 SUPER 管理許可權。新設定的全域性變數值將成為此後連入用戶端的預設 SQL 模式。
如果想獲取當前對談或全域性的 SQL 模式值,則可以使用如下語句:
SELECT @@SESSION.sql_mode;
SELECT @@GLOBAL. sql_mode;
其返回值由當前啟用的所有模式構成,兩個模式之間以逗號隔開。如果當前沒有啟用任何模式,則返回一個空值。