url: jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
1. serverTimezone 關於時區的設置
常見問題:從數據庫返回的時間比真正保存的時間提前8小時。
解決:將 serverTimezone=UTC 改為 serverTimezone=Asia/Shanghai
2.useUnicode和characterEncoding 添加的作用是:指定字符的編碼、解碼格式。
例如:mysql數據庫用的是gbk編碼,而項目數據庫用的是utf-8編碼。這時候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下兩個方面:
2.1 存數據時:
數據庫在存放項目數據的時候會先用UTF-8格式將數據解碼成字節碼,然后再將解碼后的字節碼重新使用GBK編碼存放到數據庫中。
2.2 取數據時:
在從數據庫中取數據的時候,數據庫會先將數據庫中的數據按GBK格式解碼成字節碼,然后再將解碼后的字節碼重新按UTF-8格式編碼數據,最后再將數據返回給客戶端。
3.zeroDateTimeBehavior
JAVA連接MySQL數據庫,在操作值為0的timestamp類型時不能正確的處理,而是默認拋出一個異常,就是所見的:java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 7 to TIMESTAMP。這一問題在官方文檔中有詳細說明,詳見如下鏈接:
http://bugs.mysql.com/bug.php?id=19274
http://dev.mysql.com/doc/refman/5.5/en/connector-j-installing-upgrading.html
在JDBC連接串中有一項屬性:zeroDateTimeBehavior,可以用來配置出現這種情況時的處理策略,該屬性有下列三個屬性值:
exception:默認值,即拋出SQL state [S1009]. Cannot convert value....的異常;
convertToNull:將日期轉換成NULL值;
round:替換成最近的日期即0001-01-01;
因此對於這類異常,可以考慮通過修改連接串,附加zeroDateTimeBehavior=convertToNull屬性的方式予以規避,例如:
jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull
從另一個層面講,這類異常的觸發也與timestamp賦值的操作有關,如果能夠在設計階段和記錄寫入階段做好邏輯判斷,避免寫入 '0000-00-00 00:00:00'這類值,那么也可以避免出現 Cannot convert value '0000-00-00 00:00:00' from column N to TIMESTAMP的錯 誤。
4.useSSL
是否允許SSL連接