Mysql的sql_mode

OldBoy~發表於2017-05-17

(一) 基本介紹

set sql_mode="",即強制不設定MySql模式(如不作輸入檢測、錯誤提示、語法模式檢查等)應該能提高效能,但有如下問題: 

如果插入了不合適資料(錯誤型別或超常),mysql會將資料設為“最好的可能資料”而不報錯,如: 

/數字 設為:0/可能最小值/可能最大值 

/字串 設為:空串/能夠儲存的最大容量字串 

/表示式 設為:返回一個可用值(1/0-null) 

所以,解決辦法是:所有列都要採用預設值,這對效能也好。 

當然,如果你特別喜歡sqlserver的模式,也可以設定為sql_mod="sqlserver"(好像是這麼寫的),這樣mysql就按sqlserver的方式運作了,建議不要如此。

(二) 常見方式

mysql可以執行在不同sql mode模式下面,sql mode模式定義了mysql應該支援的sql語法,資料校驗等! 

檢視預設的sql mode模式: 

select @@sql_mode;

我的資料庫是: 

STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在此模式下面,如果插入的資料的長度大於定義的長度,那麼就會報錯! 

set session sql_mode='REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI';

在這種模式下面:插入的資料的長度大於定義的時候,就會擷取,並警告,但是可以插入進去 

session表示只在本次中有效 

global:表示在本次連線中不生效,而對於新的連線就生效 

啟用NO_BACKSLASH_ESCAPES模式,使反斜線成為普通字元,在匯入資料時候,如果資料中有反斜線,啟用這個模式是個不錯的選擇   

啟用PIPES_AS_CNCAT模式,將||看成是普通字串

sql mode值  說明

ANSI 

'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE和ANSI組合',

這種模式使語法   和行為更   符合標準的sql

STRICT_TRANS_TABLES          使用與事務和非事務表,嚴格模式 

TRADITIONAL               也是嚴格模式,對於插入不正確的值給出錯誤而不是警告。用在事務時,只要發生錯誤就立即回滾

(三) 修改sql_mode 解決問題

今天安裝了個mysql5.0,拿了一個很久之前網上下的程式檢查一下是否工作正常.

發現以前的程式居然不能正常執行,提示資訊如下:

Database error: Invalid SQL: INSERT INTO Survey_UserHistory(userId,jobId,type,action,startTime,endTime) VALUES(’17′,”,’User’,'Login’,”,’2008-11-23 14:33:56′)

MySQL error: 1366 (Incorrect integer value: ” for column ‘jobId’ at row 1)

Session halted.

第一時間的反應是跟mysql5.0新加的sql-mode有關係,因為前一陣子剛剛看過手冊.果然,作了如下更改後就不再提示了.

修改 my.ini 檔案.

# Set the SQL mode to strict
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

改為:

# Set the SQL mode to strict
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

相關文章