Mysql之SQL Mode用法詳解_Mysql

來源:互聯網
上載者:User

一、Mysql SQL Mode簡介

通常來說MySQL伺服器能夠工作在不同的SQL模式下,並能針對不同的用戶端以不同的方式應用這些模式。這樣,應用程式就能對伺服器操作進行量身定製以滿足自己的需求。這類模式定義了MySQL應支援的SQL文法,以及應該在資料上執行何種確認檢查。這樣,就能在眾多不同的環境下、與其他資料庫伺服器一起更容易地使用MySQL。可以使用“--sql-mode="modes"”選項,通過啟動mysqld來設定預設的SQL模式。而從MySQL 4.1開始,也能在啟動之後,使用SET [SESSION|GLOBAL] sql_mode='modes'語句,通過設定sql_mode變數更改其模式。

通常在linux下安裝完mysql後,其預設的sql-mode值是空,在這種情形下mysql執行的是一種不嚴格的檢查,例如日期欄位可以插入'0000-00-00 00:00:00'這樣的值,還有如果要插入的欄位長度超過列定義的長度,那麼mysql不會終止操作,而是會自動截斷後面的字元繼續插入操作,如下例:

mysql> create table t5 (c1 char(3));mysql> insert into t5 values('abcd');mysql> select * from t5;+------+| c1 |+------+| abc |+------+1 row in set (0.00 sec)

我們發現插入的字元被自動截斷了,但是如果我們本意希望如果長度超過限制就報錯,那麼我們可以設定sql_mode為STRICT_TRANS_TABLES,如下:

mysql> set session sql_mode='STRICT_TRANS_TABLES'

這樣我們再執行同樣的操作,mysql就會告訴我們插入的值太長,操作被終止,如下:

mysql> insert into t5 values('abcd');ERROR 1406 (22001): Data too long for column 'c1' at row 1

經常使用的sql_mode值:

Sql_mode值 描述
ANSI 更改文法和行為,使其更符合標準SQL。
STRICT_TRANS_TABLES 如果不能將給定的值插入到事務表中,則放棄該語句。對於非事務表,如果值出現在單行語句或多行語句的第1行,則放棄該語句。本節後面給出了更詳細的描述。
TRADITIONAL Make MySQL的行為象“傳統”SQL資料庫系統。該模式的簡單描述是當在列中插入不正確的值時“給出錯誤而不是警告”。注釋:一旦發現錯誤立即放棄INSERT/UPDATE。如果你使用非事務儲存引擎,這種方式不是你想要的,因為出現錯誤前進行的資料更改不會“滾動”,結果是更新“只進行了一部分”。

說明:如果把sql_mode的值設定成後面的兩個值(也就是我們說的strict 模式),那麼當在列中插入或更新不正確的值時,mysql將會給出錯誤,並且放棄insert/update操作。在我們的一般應用中建議使用這兩種模式,而不是使用預設的空或ANSI模式。但是需要注意的問題是,如果資料庫運行在strict 模式下,並且你的儲存引擎不支援事務,那麼有資料不一致的風險存在,比如一組sql中有兩個dml語句,如果後面的一個出現了問題,但是前面的已經操作成功,那麼mysql並不能復原前面的操作。因此說設定sql_mode需要應用人員權衡各種得失,從而得到一個合適的選擇。

Sql_mode的值還有很多,這裡不再累述,可以參考相關的手冊。

二、SQL Mode與可移植性

如果mysql與其它異構資料庫之間有資料移植的需求的話,那麼下面的sql_mode的組合設定可以達到相應的效果:

資料庫 Sql_mode值
DB2 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
MAXDB PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER
MSSQL PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS
ORACLE PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER
POSTGRESQL PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS

三、SQL Mode與資料效驗

SQL Mode 還可以實現對資料效驗和轉移等功能如:

1.效驗日期資料合法性.
2.在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤
3.將‘"'視為識別符引號(‘`'引號字元)
4.禁用反斜線字元(‘\')做為字串內的退出字元。啟用NO_BACKSLASH_ESCAPES模式,反斜線則成為一般字元。

5.將||視為字串串連操作符(+)(同CONCAT()),而不視為OR。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.