由于某项目需要从Oracle改为Mysql服务器,涉及到数据库迁移问题,这里分享下操作流程。
1、用navicat将Oracle表结构和数据迁移到MySQL
选工具-数据传输
如图选择传输对象,再点击选项,建议把“遇到错误继续勾选”,否则有时候1、2张表报错,会导致整个传输中断。
选择需要传输的表,这里直接选“运行期间的全部”即可,点击“下一步”开始传输传输结束后记得看看日志,是哪几张表报错,可以根据表结构手动去创建。
2、项目改成用MySQL数据库
将mysql的jdbc-connect包放入项目,将jdbc.properties的配置改成mysql的
3、Oracle迁Mysql语法修改(这里只列举我遇到的)
问题:Oracle新增的时候使用序列来实现自增主键,并在新增后返回该主键
解决方法:给MySQL表的主键改成int或bigint类型,设置自增,然后SQL改成下面这样
问题:Oracle新增的时候使用UUID,并在新增后返回该主键
解决方法:使用replace(uuid(),"-","")来代替
问题:Oracle查询时用双引号包住字段名,MySQL不支持这种写法
解决方法:Oracle中双引号包住表示区分大小写,MySQL默认是区分大小写的,直接去掉双引号即可
问题:Oracle中直接用sysdate返回当前日期
解决方法:MySQL中改为用sysdate()函数
问题:Oracle中模糊查询拼接字符串用“||”来拼接,MySQL中"||"表示or
解决方法:去掉||且单引号改为双引号,即 "%"#{xxxx}"%"
问题:Oracle中格式化日期用了to_char()函数,Mysql不支持
解决方法:MySQL中用date_format()函数,一般用date_format('${xxxDate,jdbcType=VARCHAR}', '%Y-%m-%d %H:%i:%S') 这种格式
问题:MySQL中的date_format()函数参数如果是空字符串,则会报错,Oracle则不报错
解决方法:用<if test="xxx != null and xxx != ''”> </if>包裹
问题:Oracle用TO_NUMBER()函数来把字符串转换数字格式
解决方法:如果是数字键的运算,不需要转换函数,结果自动为数字类型,其他情况可以用cast(xx as signed int)函数,或者直接在转换的结果后+0,也能转换为数字
问题:Oracle用nlssort函数对中文字段进行拼音的排序,MySQL没有这个函数
解决方法:用convert(xxx using GBK)函数,中文字符串转换为GBK编码后就自动按照拼音顺序排列了
问题:Oracle用listagg()函数将某字段按照组拼接为长字符串
解决方法:用group_concat()+group by的写法实现
问题:Oracle用start with connect by 递归函数来查询树形结构的结果
解决方法:MySQL中并没有这种类型的相关函数,但可以通过自定义函数实现。这里看到此数据访问只是查询树的跟节点和父节点,MySQL就直接用union来查询根节点和父节点了