Mysql之SQL Mode用法詳解

2021-07-11 07:12:34 字數 2994 閱讀 1255

點我進入原文

投稿:shichen2014 字型:[增加

這篇文章主要介紹了mysql之sql mode用法,可以幫助使用者更好的理解mysql的工作模式,需要的朋友可以參考下

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

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

二、sql mode與可移植性

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

資料庫sql_mode值

db2pipes_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。

MySQL系列之SQL MODE學習筆記

最近在學習 mysql技術內幕 sql程式設計 並做了筆記,本部落格是一篇筆記型別部落格,分享出來,方便自己以後複習,也可以幫助其他人 sql mode mysql特有的乙個屬性,用途很廣,可以通過設定屬性來實現某些功能支援 全域性的sql mode select global.sql mode 當...

MySql版本問題sql mode

my.cnf 新增如下 sql mode only full group by,strict trans tables,error for division by zero,no auto create user,no engine substitution 1 檢視sql mode select ...

mysql的sql mode合理設定

mysql的sql mode合理設定 sql mode是個很容易被忽視的變數,預設值是空值,在這種設定下是可以允許一些非法操作的,比如允許一些非法資料的插入。在生產環境必須將這個值設定為嚴格模式,所以開發 測試環境的資料庫也必須要設定,這樣在開發測試階段就可以發現問題 sql mode常用值如下 o...