最近從oracle數據庫遷移到Mysql, 總結了一些不兼容和需要注意的地方,持久層用的Mybatis
1 guid盡量用代碼生成
現象:sys_guid() mysql報錯,mysql對應的為UUID(),但是帶橫線,需要替換為 replace(uuid(),'-',''),所以最好用代碼生成, 這樣直接就通用了
2 最好不用nvl、ifnull等特性函數
現象:nvl為oracle特性函數,在mysql報錯,統一替換為case when then else end
3 子查詢請帶上別名
現象:子查詢不帶別名oracle可以通過,mysql語法錯誤
4 最好不用decode()函數
現象:同nvl,替換為case when then else end
5 刪除語句不要給表加別名
現象:mysql刪除語句不支持表別名(但是Oracle支持,所以為了通用刪除時不要使用別名)
6 刪除語句最好加上from關鍵字
現象: mysql刪除必須是delete from table,oracle可以是delete table為了通用要加上from
7 字段別名統一大寫
現象:mysql沒有自動轉換為大寫,oracle會自動轉換為大寫,為了代碼能統一取值,別名統一大寫
8 分頁查詢沒有找到兼容的寫法,找到簡單改寫方法
簡單修改的辦法:rownum替換為@num,不然就是重新寫一個mysql分頁
原oracle

mysql

9 批量插入不要用insert all,用兼容寫法
現象:insert all等語法mysql不支持,報錯
改為

10 日期無法兼容,有轉換方法
現象:之前的to_date寫法導致Mysql報錯
改為拆分兩份

11不用 || 連字符
現象:mysql不支持,統一改為concat(str,str2)函數
12 concat函數只能使用兩個參數
現象:不能使用concat(str,str2,str3),mysql支持,oracle不支持
13 wm_concat()行列轉換無法兼容,有轉換方法
方案:oracle wm_concat() 對應mysql group_concat()
14 從oracle遷移到mysql的數據,number類型被Mysql默認成了這個鬼樣子(不確定是不是遷移引起)
現象:mysql顯示類型

導致報錯

方案:修改字段小數點為0,如果確定不是遷移過程引起,則需要整理腳本統一修改
其實1、2、3、4、5、6、7、9、11、12項是可以加入開發規范和開發禁用列表的
