摘要:之前沒有接觸過mysql的sql_mode的知識,只是遇到過我的cms在我本地和我的服務器上是好好的,然后有的人在用的時候,如果插入的數據過...
之前沒有接觸過mysql的sql_mode的知識,只是遇到過我的cms在我本地和我的服務器上是好好的,然后有的人在用的時候,如果插入的數據過長的話會報錯,我一直不知怎么解決,今天終于知道了。原來都是SQL_MODE設置的原因。
SQL_MODE默認為空,可以在MySQL的配置文件如my.cnf和my.ini中進行修改,也可以在客戶端工具中或者命令來進行修改。
查詢當前SQL_MODE設置:
SELECT @@global.sql_mode;
SQL_MODE的常見模式:
STRICT_TRANS_TABLES :在該模式下,如果一個值不能插入到一個事務表(例如表的存儲引擎為InnoDB)中,則中斷當前的操作不影響非事務表(例如表的存儲引擎為MyISAM)。
ALLOW_INVALID_DATES :該選項并不完全對日期的合法性進行檢查,只檢查月份是否在1~12之間,日期是否在1~31之間。該模式僅對DATE和DATETIME類型有效,而對TIMESTAMP無效,因為TIMESTAMP總是要求一個合法的輸入。
ANSI_QUOTES :啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它將被解釋為識別符。
ERROR_FOR_DIVISION_BY_ZERO :在INSERT或UPDATE過程中,如果數據被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,那么數據被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。
嚴格模式是指將SQL_MODE變量設置為 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 中的至少一種。
在SQL_MODE設置為空的情況下,mysql執行的是一種不嚴格的檢查,例如日期字段可以插入'0000-00-00 00:00:00'這樣的值,還有如果要插入的字段長度超過列定義的長度,那么mysql不會終止操作,而是會自動截斷后面的字符繼續插入操作。
既然知道了這些,那就可以加入以下設置:
如果mysql版本大于 5.0的話,在php連接mysql的時候會用如下語句
if ($serverinfo > '5.0') { mysqli_query($this->sql, "SET sql_mode=''"); }
這樣一來,就可以防止用戶誤操作,把定義的字段寫的過多而報錯的情況了。
網友評論:
g
2017-01-16 17:59:50 回復