达梦数据库适配采坑记
问题一
问题描述:
字段内容超长错误:
问题详解:
达梦数据库和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
解决方案:
方案一:
前端修改代码;
方案二:
定义一个VO,把后端的返回的List
问题七:
问题描述:
达梦数据库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;
作者:彼岸舞
时间:2020 623
内容关于:达梦数据库
本文属于作者原创,未经允许,禁止转发