MySQL伺服器的SQL模式

安全劍客發表於2020-05-28
與其它資料庫不同,MySQL 伺服器可以在不同的 SQL 模式下執行,並且可以針對不同的客戶端以不同的方式應用這些模式,具體取決於 sql_mode 系統變數的值。

SQL 模式定義了 MySQL 資料庫所支援的 SQL 語法和資料校驗(資料驗證檢查),這樣可以更容易的在不同環境下使用 MySQL。

在 MySQL 中,SQL 模式常用來解決下面幾類問題:

透過設定 SQL Mode,可以完成不同嚴格程度的資料校驗,有效地保障了資料的準確性。

透過設定 SQL Mode 為 ANSI 模式,可以保證大多數 SQL 符合標準的 SQL 語法,使不同資料庫之間進行遷移時,不需要進行較大的修改。

在不同資料庫之間進行資料遷移之前,設定 SQL Mode 可以使 MySQL 中的資料更方便地遷移到目標資料庫中。

sql_mode 系統變數的常用值

下面列出了幾種 SQL 模式常用的值。

TRICT_ ALL_TABLES 和 STRICT_ TRANS_TABLES

如果將 sql_mode 的值設定為 TRICT_ALL_TABLES 和 STRICT_TRANS_TABLES,那麼 MySQL將啟用“嚴格”模式。在嚴格模式下,MySQL 伺服器會更加嚴格地對待接收到的不合格資料,它不會把這些不合格的資料轉換為最為接近的有效值,而是會拒絕接收它們。

簡單來說 MySQL 的嚴格模式就是 MySQL 自身對資料進行的嚴格校驗,例如格式、長度和型別等。

TRADITIONAL

類似於嚴格模式,但是對於插入的不合格值會給出錯誤而不是警告。可以應用在事務表和非事務表,用於事務表時,只要出現錯誤就會立即回滾。

如果你使用的是非事務儲存引擎,建議不要把 SQL Mode 值設定為 TRADITIONAL,因為出現錯誤前進行的操作不會回滾,這樣會導致操作只進行了一部分。

ANSI_QUOTES

MySQL 伺服器會把雙引號識別為一個識別符號引用字元,而不是字串的引號字元。所以在啟用 ANSI_QUOTES 時,不能用雙引號來引用字串。

PIPES_ AS_ CONCAT

會讓 MySQL 伺服器把||當成一個標準的 SQL 字串連線運算子,而不會把它當成是 OR 運算子的同義詞。

在 Oracle 等資料庫中,||被視為字串的連線運算子,所以在其它資料庫中含有||運算子的 SQL 在 MySQL 中將無法執行,為了解決這個問題,MySQL 提供了這個值。

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;

其返回值由當前啟用的所有模式構成,兩個模式之間以逗號隔開。如果當前沒有啟用任何模式,則返回一個空值。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2694889/,如需轉載,請註明出處,否則將追究法律責任。

相關文章