版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/H_233/article/details/87810363
總結一下之前在開發中遇到的一個小BUG。。
`create_time` datetime NOT NULL COMMENT '創建時間',
`_timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
上面_timestamp說明此值不能爲null,默認值得是'0000-00-00 00:00:00'
當你在插入的時候mybatis拼寫的時候沒有放入這個參數,他會給你設置一個默認的的值,但是如果你寫了這個值(sql語句中包含這個值),
這個值爲null(在bean中),這時候會報錯。
在數據庫開發中,爲業務新增了表,設計表的時候未給表的創建時間字段和更新時間字段設置默認值。當然我沒有設置,那麼導致出現了這樣一個的問題,就是我在插入記錄的時候,由於沒有指定默認值,MySQL會給TIMESTAMP類型字段默認一個‘0000-00-00 00:00:00’,然後在通過JDBC轉換成java.sql.Timestamp的時候報了這樣一個錯:
java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 1 to TIMESTAMP.
分析原因:首先我們知道MySQL中TIMESTAMP支持的時間範圍爲19700101080001到2038年的某個時間,但是當插入的值超出了取值範圍,MySQL認爲該值溢出,會使用‘0000-00-00 00:00:00’進行填補,所以TIMESTAMP存‘0000-00-00 00:00:00’是沒問題的。
而真正的原因我們可以在MySQL中找到:https://bugs.mysql.com/bug.php?id=19274
不難發現 JDBC 默認最小時間 爲 ‘0001-01-01 00:00:00’ ,而‘0000-00-00 00:00:00’ 在MySQL中也只是作爲一個特殊值存在的,自然轉換時就會報錯。
因此官方提供了我們解決策略:
在JDBC連接串中有一項屬性:zeroDateTimeBehavior,可以用來配置出現這種情況時的處理策略,該屬性有下列三個屬性值:
l exception:默認值,即拋出SQL state [S1009]. Cannot convert value....的異常;
l convertToNull:將日期轉換成NULL值;
l round:替換成最近的日期即0001-01-01;
因此對於這類異常,可以考慮通過修改連接串,附加zeroDateTimeBehavior=convertToNull屬性的方式予以規避。
總結解決方式:
1、在設計表的時候加入默認值(避免存入‘0000-00-00 00:00:00’)
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '創建時間'
這樣的話,在新增記錄的時候就不會導致記錄裏存在一條時間值爲‘0000-00-00 00:00:00’的記錄,因爲java.sql.Timestamp本身不支持該值,所以不存在我們主動賦值的情況,業務上也沒有這個需求。。當然手動MySQL insert這樣一條記錄除外。。。
2、在JDBC的url加上zeroDateTimeBehavior參數:
以application.yml爲例,在配置datasource的時候其中url可以配置如下
jdbc:mysql://localhost:3306/pe?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
這樣JDBC轉換時就會將零值轉成NULL
或者
jdbc:mysql://localhost:3306/pe?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=round
這樣JDBC轉換時就會將零值轉成‘0001-01-01 00:00:00’
以上就是兩種解決方式,當然還是推薦第一種。
————————————————
版權聲明:本文爲CSDN博主「藍色D風車」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/H_233/article/details/87810363