原文:mysql升級到5.7時間戳報錯html
往數據庫裏建立新表的時候報錯:mysql
[Err] 1067 - Invalid default value for 'updateTime'sql
DROP TABLE IF EXISTS `passwd_reset`;
CREATE TABLE `passwd_reset` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`staffId` int(11) DEFAULT NULL,
`toEmail` varchar(50) DEFAULT NULL,
`token` varchar(100) DEFAULT NULL,
`validTime` int(11) DEFAULT NULL,
`createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updateTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;數據庫
mysql5.7默認爲session
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
改成oracle
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
這樣以前插入語句就能正常執行了函數
sql_mode 經常使用值說明spa
官方手冊專門有一節介紹 https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html 。 SQL Mode 定義了兩個方面:MySQL應支持的SQL語法,以及應該在數據上執行何種確認檢查。.net
SQL語法支持類htm
ONLY_FULL_GROUP_BY
對於GROUP BY聚合操做,若是在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的。是能夠理解的,由於不在 group by 的列查出來展現會有矛盾。 在5.7中默認啓用,因此在實施5.6升級到5.7的過程須要注意:
ANSI_QUOTES
啓用 ANSI_QUOTES 後,不能用雙引號來引用字符串,由於它被解釋爲識別符,做用與 ` 同樣。
設置它之後,update t set f1="" ...,會報 Unknown column ‘’ in ‘field list 這樣的語法錯誤。
PIPES_AS_CONCAT
將 || 視爲字符串的鏈接操做符而非 或 運算符,這和Oracle數據庫是同樣的,也和字符串的拼接函數 CONCAT() 相相似
NO_TABLE_OPTIONS
使用 SHOW CREATE TABLE 時不會輸出MySQL特有的語法部分,如 ENGINE ,這個在使用 mysqldump 跨DB種類遷移的時候須要考慮
NO_AUTO_CREATE_USER
字面意思不自動建立用戶。在給MySQL用戶受權時,咱們習慣使用 GRANT ... ON ... TO dbuser順道一塊兒建立用戶。設置該選項後就與oracle操做相似,受權以前必須先創建用戶。5.7.7開始也默認了。
數據檢查類
NO_ZERO_DATE
認爲日期 ‘0000-00-00’ 非法,與是否設置後面的嚴格模式有關。 1.若是設置了嚴格模式,則 NO_ZERO_DATE 天然知足。但若是是 INSERT IGNORE 或 UPDATE IGNORE,’0000-00-00’依然容許且只顯示warning 2.若是在非嚴格模式下,設置了NO_ZERO_DATE,效果與上面同樣,’0000-00-00’容許但顯示warning;若是沒有設置NO_ZERO_DATE,no warning,當作徹底合法的值。 3.NO_ZERO_IN_DATE狀況與上面相似,不一樣的是控制日期和天,是否可爲 0 ,即 2010-01-00 是否合法。
NO_ENGINE_SUBSTITUTION
使用 ALTER TABLE或CREATE TABLE 指定 ENGINE 時, 須要的存儲引擎被禁用或未編譯,該如何處理。啓用NO_ENGINE_SUBSTITUTION時,那麼直接拋出錯誤;不設置此值時,CREATE用默認的存儲引擎替代,ATLER不進行更改,並拋出一個 warning。
STRICT_TRANS_TABLES
設置它,表示啓用嚴格模式。
注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨指 INSERT、UPDATE出現少值或無效值該如何處理:
1.把 ‘’ 傳給int,嚴格模式下非法,若啓用非嚴格模式則變成0,產生一個warning
2.Out Of Range,變成插入最大邊界值
3.A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition
上面並無囊括全部的 SQL Mode,選了幾個表明性的。
sql_mode通常來講不多去關注它,沒有遇到實際問題以前不會去啓停上面的條目。咱們常設置的 sql_mode 是 ANSI、STRICT_TRANS_TABLES、TRADITIONAL,ansi和traditional是上面的幾種組合。
ANSI:更改語法和行爲,使其更符合標準SQL
至關於REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
TRADITIONAL:更像傳統SQL數據庫系統,該模式的簡單描述是當在列中插入不正確的值時「給出錯誤而不是警告」。
至關於 STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
ORACLE:至關於 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USE 不管何種mode,產生error以後就意味着單條sql執行失敗,對於支持事務的表,則致使當前事務回滾;但若是沒有放在事務中執行,或者不支持事務的存儲引擎表,則可能致使數據不一致。MySQL認爲,相比直接報錯終止,數據不一致問題更嚴重。因而 STRICT_TRANS_TABLES 對非事務表依然儘量的讓寫入繼續,好比給個」最合理」的默認值或截斷。而對於 STRICT_ALL_TABLES,若是是單條更新,則不影響,但若是更新的是多條,第一條成功,後面失敗則會出現部分更新。
5.6.6 之後版本默認就是NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,5.5默認爲 ‘’ 。
設置 sql_mode
查看
查看當前鏈接會話的sql模式:
mysql> select @@session.sql_mode;
或者從環境變量裏取
mysql> show variables like "sql_mode";
查看全局sql_mode設置:
mysql> select @@global.sql_mode;
只設置global,須要從新鏈接進來纔會生效
設置
mysql> set sql_mode='';
mysql> set global sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';若是是自定義的模式組合,能夠像下面這樣Adding only one mode to sql_mode without removing existing ones:mysql> SET sql_mode=(SELECT CONCAT(@@sql_mode,','));Removing only a specific mode from sql_mode without removing others:mysql> SET sql_mode=(SELECT REPLACE(@@sql_mode,'',''));配置文件裏面設置