000000

版權聲明:本文爲博主原創文章,遵循 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章