国产化是一种趋势,尤其是面向政府的项目、产品等,所以记录达梦改造时遇到的问题。
函数不兼容
- group_concat 对应达梦 wm_concat 目前没有找到完全兼容函数
- ifnull(expr,true,false),mysql中ifnull函数可以有3个参数,达梦只有2个,mysql也有2个的,所以将业务改为2个就可以兼容两个数据库
- exists: mysql 中可以select exists(子查询),但是达梦中exists子查询只能用在where条件中
- date_add函数 ,mysql中3个参数,达梦只有2个,目前没有找到完全兼容函数
- date_diff 对应达梦中可以用timestamp_diff代替,mysql也可以用。
保留关键字
目前常用到的:order ,desc,describe,schema,function,condition,domain,synonym,rows,partition,xml,object,second,first,user
语法不兼容
- 如果字段类型是text类型,则在mybatis查询中无法直接使用“=”进行查询,会报dataType does not match,建议需要查询的字段改为varchar2.
- 达梦不能直接将text改为varchar2,只能类似编程中的交换一样,先新增一个字段,update过来,然后删掉原字段,再改名回原字段名。
jdbc连接字符串
jdbc:dm://" + host + ":" + port + "?schema=" + dbName
sql工具
- 目前使用达梦8自带数据库工具,macos下暂时还没找,只有windows版本。
- 如果需要将达梦数据库数据导出成insert语句,好迁移到mysql的话,可以用达梦自带迁移工具,创建任务-从达梦到sql即可,生成文件再做些改动即可。
小技巧
- 在达梦数据库工具中,默认查询跟oracle一样,会在用户名的模式下,访问其他模式的话,必须要加上schema.tableName,但是很多时候不太习惯这么做,只需要在执行sql语句前切换schema即可,如 set schema task;
- jdbc链接字符串中也会类似问题,但是低版本驱动中不支持schema参数,只有在比较新的驱动中可以再链接字符串中指定schema。
产品化建议:
如果项目是产品型项目,既要兼容mysql,又要兼容达梦,建议注意一下问题:
- 尽可能的不要用保留关键字,可以像flowable一样,关键字后面加,如order -> ORDER
- 尽可能不要用mysql专用语法,如update on duplicate key
- 使用exists,ifnull ,date_add等日期函数时要注意兼容性问题。
- 如果实在躲不过去,如group_concat, 则可以用mybatis中的databaseIdProvider来定制sql,具体咨询百度。
本文固定链接:杨晨辉的个人博客 » Mysql迁移达梦问题汇总
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!