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