(一) 基本介紹
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”