达梦数据库适配采坑记

问题一

问题描述:

字段内容超长错误:

问题详解:

达梦数据库和Oracle同样,对字段的长度有严格的规范,当然mysql也是有的,但是默认是不启用的,哪怕超出了,也会自动扩容,但是Oracle和达梦是不会的;

解决方案:

方案一:

对数据库的字段长度进行变更;

方案二:

变更数据类型;

方案三:

约束字段长度,或者进行截取处理

问题二:

问题描述:

语句分析错误,不识别[`]符号

问题详解:

在Mysql中[`]符号是为了防止和Mysql的系统字段冲突,标识这个一个普通字段,但是在达梦数据库中,不识别这个符号;

解决方案:

方案一:

采用MyBatis的拦截器对SQL进行拦截处理;

方案二:

对XML中的SQL里面的[`]符号进行删除替换(推荐);

问题三:

问题描述:

不是GROUP by 表达式

问题详解:

因为在Oracle和达梦中查询字段必须在分组中出现,所以报错

解决方案:

方案一:

修改代码,去掉Sql中查询的不是分组的字段,通过代码二次查询实现;

问题四:

问题描述:

问题详解:

解决方案:

方案一:

案例:

问题五:

问题描述:

on duplicate key update语法分析错误

问题详解:

属于Mysql专用语法,在Oracle和达梦中是不支持的

解决方案:

方案一:

使用Merge修改(不推荐)

案例:

修改前:
insert into sys_logininfo(info_id,infp_name) values(1,2) on duplicate key update info_id=2,infp_name=’aaa’;
修改后:
merge into sys_logininfo t1 using(
select 1 info_id,2 infp_name from dual
) t2 on
(t1.info_id=t2.info_id)
WHEN MATCHED THEN
update set info_id=2,infp_name=’aaa’ WHEN NOT MATCHED THEN INSERT VALUES (1,2);

使用详解:

https://blog.csdn.net/jackpk/article/details/50336941

遗留问题:

在使用druid连接池时,报了一个错,但是并不影响

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :‘
    MERGE INTO sys_logininfo t1 US‘, expect MERGE, actual IDENTIFIER pos 82, line 1, column 1, token IDENTIFIER MERGE

方案二:

通过代码拆分insertOrUpdate 拆分为insert和update

问题六:

问题面熟:

前端展示空白,后端没有报错

样例:

问题详解:

因为Mysql迁移到了达梦,所以字段全部由小写转换为大写,本身返回Bean是没有问题的,但是一些特殊的SQL返回的是List所以结果Key全部为大写,所以前端调用时为小写,所以无法展示;

解决方案:

方案一:

前端修改代码;

方案二:

定义一个VO,把后端的返回的List,转成定义的VO,返回前端;

问题七:

问题描述:

达梦数据库concat函数不认识[“]符号

问题详解:

在Mysql中无论是[‘][“]都是识别的,但是在达梦中只识别[‘];

解决方案:

方案一:

用[‘]替换项目中的[“];

样例:

修改前:
select * from aa where a like CONCAT(“%”,”龙”,”%”);
修改后:
select * from aa where a like CONCAT(‘%’,’龙’,’%’);

问题八:

问题描述:

达梦数据库查询列别名时使用[‘’]包裹,是会报错的

问题详解:

达梦数据库在做关键字区分时采用[“”]包裹

解决方案:

方案一:

采用[“”]替换[‘’]

样例:

不带关键字
修改前:
select aa as ‘a’ from aaa;
修改后
select aa as a from aaa;
带关键字
修改前:
select aa as ‘index’ from aaa;
修改后:
select aa as “index” from aaa;

问题九:

问题描述:

使用concat直接包裹字段,会报错,无法解析的表达式

问题详解:

达梦不支持无条件的拼接

解决方案:

方案一:

去掉concat

样例:

修改前:
select concat(aaa) as a from aa;
修改后:
select aaa as a from aa;

 

作者:彼岸舞

时间:2020623

内容关于:达梦数据库

本文属于作者原创,未经允许,禁止转发