1. 程式人生 > >Data truncation: Incorrect datetime value: '' for column 'start' at row 1的解決方法

Data truncation: Incorrect datetime value: '' for column 'start' at row 1的解決方法

公司有一個專案報錯如下:

java.lang.RuntimeException: java.sql.BatchUpdateException: Data truncation: Incorrect datetime value: '' for column 'start' at row 1
at com.honghe.dss.CommonSql.execUpdate(CommonSql.java:226)
at com.honghe.dss.CommonSql.execUpdate(CommonSql.java:247)
at com.honghe.dss.JdbcBase.processSql(JdbcBase.java:62)
at com.honghe.dss.JdbcMysql.importData(JdbcMysql.java:71)
at com.honghe.dss.Main$1.run(Main.java:118)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.sql.BatchUpdateException: Data truncation: Incorrect datetime value: '' for column 'start' at row 1
at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1193)
at com.honghe.dss.CommonSql.execUpdate(CommonSql.java:212)
... 6 more

後來多方查詢才找到問題:MySQL中第一列中的datetime不能為空程式裡面給datetime型別的一個欄位是一個空字串,因此報錯。

sql-mode預設為"STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",

這裡把STRICT_TRANS_TALBES去掉之後,重啟MySQL,就OK了。 
 STRICT_TRANS_TABLES的工作方式:對於事務性儲存引擎,在語句中任何地方出現的不良資料值均會導致放棄語句並執行回滾。 對於非事務性儲存引擎,如果錯誤出現在要插入或更新的第1行,將放棄語句。(在這種情況下,可以認為語句未改變表,就像事務表一樣)。首行後出現的錯誤不會導致放棄語句。取而代之的是,將調整不良資料值,並給出告警,而不是錯誤。換句話講,使用STRICT_TRANS_TABLES後,錯誤值會導致MySQL執行回滾操作,如果可以,所有更新到此為止。  當然,如果想要執行嚴格的檢查,請啟用STRICT_TRANS_TABLES,那樣的話,就得修改程式,把給datetime型別的空字元修改成"0000-00-00 00:00:00"即可。

也可以使用varchar型別代替datetime,經測試也可以進行比較。