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>createtablet5 (c1 char(3));
MySQL>insertinto t5 values('abcd');
MySQL>select* from t5;
+------+
| c1|
+------+
| abc |
+------+
1 row inset (0.00sec)
我們發現插入的字符被自動截斷了,但是如果我們本意希望如果長度超過限制就報錯,那麼我們可以設置sql_mode為STRICT_TRANS_TABLES,如下:
MySQL>setsession sql_mode='STRICT_TRANS_TABLES'
這樣我們再執行同樣的操作,MySQL就會告訴我們插入的值太長,操作被終止,如下:
MySQL>insertinto t5 values('abcd');
ERROR1406 (22001): Data too longfor column'c1'at row 1
說明:如果把sql_mode的值設置成後面的兩個值(也就是我們說的嚴格模式) ,那麼當在列中插入或更新不正確的值時,MySQL將會給出錯誤,並且放棄insert/update操作。在我們的一般應用中建議使用這兩種模式,而不是使用默認的空或ANSI模式。但是需要注意的問題是,如果數據庫運行在嚴格模式下,並且你的存儲引擎不支持事務,那麼有數據不一致的風險存在,比如一組sql中有兩個dml語句,如果後面的一個出現了問題,但是前面的已經操作成功,那麼MySQL並不能回滾前面的操作。因此說設置sql_mode需要應用人員權衡各種得失,從而得到一個合適的選擇。