MySQL8升級遇到的各式各樣問題

xuexiaogang發表於2021-12-11

自己原文公眾號: https://mp.weixin.qq.com/s/j2b9yO_9r5dYvXogBfqEwQ

MySQL8已經出來2年多了,可以用了。尤其是大家在5.6和5.7上加欄位加不上的,強烈推薦上MySQL8吧。

     最近有人問我升級需要注意什麼?官網能查到的就是說要換JDBC的包。然後官網給出了一個和5.7不一樣的語法:

mysql5.7group by  預設還有排序功能, 8.0 預設只分組不排序,需要加 order by 才排序。舉例在 5.7

select dept_no,count(*) from t_group group by dept_no; 這樣的是按照 dept_no 預設升序排序。在 8.0 中如果也需要實現同樣的效果需要 select dept_no,count(*) from t_group group by dept_no  order by dept_no 這個差異點對開發影響不大,因為大多數開發人員都習慣於 8.0 的這種寫法,甚至沒有考慮過 5.7 的情況。

其他就沒有其他了。(當然了有些引數和資料字典的名字這種和應用開發沒什麼關係這裡就不說了)

     我覺得可能是官方(老美)覺得有些不該是問題的。但是我從不同渠道看到了其實還是有其他問題的。

     問題1:有些場景我們中國的開發人員喜歡全部用字串(可能是java為了偷懶不 轉換了)所以時間、數值全是字串。(哎,oracle mysql java都是甲骨文的,這三個團隊的尤其是java團隊的就不考慮一下這個開發語言怎麼來適配一下資料庫嗎)結果自然出乎意料,sum(string)的時候整數會出現小數點。比如原來是9現在顯示9.0.   5.7沒有這種情況8有。老美可能覺得資料結構是開發的基礎,都應該掌握的。但是可能不符合中國國情。就像老外覺得SQL都應該用到索引,但是在我國全表掃描是常態。

    問題2:這樣的設定我覺得不能說是有問題。這個意思是資料庫的時區跟蹤作業系統走。

那麼作業系統時區是什麼?

看上去也沒有問題。

    不過測試環境有人反饋說時間差了13個小時。不解,嚴重不解。為什麼?為了弄清楚這個問題只能去重現一下。

在MySQL建立一個表w(我意思是why的意思)就兩列,id和time

編寫(又抄又改的)一段主要是為了說明問題。

可以看到紅框,我用的是8的jdbc,區別在於CJ兩個字元。之前的是不帶這個的。

綠色是我寫的SQL(如果是我寫程式碼我絕對會這樣)

藍色是站在開發角度寫的(實在不明白開發為什麼要這樣做)也許這就是物件導向和麵向資料庫不可調和的。

黃色是最終結果,可以看出是差了13個小時。

對於這個問題,我的角度結論是作業系統沒有錯,資料庫也沒有錯。如果用資料庫自帶的函式,也是通過JDBC寫資料庫也沒問題。問題在於藍色的寫法需要有前提條件。我後來也問了其他用過8版本JDBC的開發。他們說他們是這樣定義連線字串的

jdbc:mysql://IP:3306/XXX?useUnicode=true&characterEncoding=UTF-8& serverTimezone=PRC&allowMultiQueries=true&autoReconnect=true&useSSL=false

加了紅色部分就一點問題也沒有了。

我在此依然是建議不管什麼資料庫你就用她自帶的時間函式,這樣少很多麻煩。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847142/,如需轉載,請註明出處,否則將追究法律責任。

相關文章