1. 程式人生 > >Mysql的sql_mode

Mysql的sql_mode

too 發現 tran 新的 類型 sql_mode 錯誤提示 最大 error

(一) 基本介紹

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