DM达梦数据库遇过的坑

最近在做信创环境的项目,原项目用的MySQL数据库,转到DM数据库中好多SQL都出现了问题,为方便以后开发,将遇到过的问题在这里做个记录,以后会不断更新。

转换丢失警告

情形一:
出错原因:原SQL里使用了CAST(id as char)函数,试图将int类型的id转换成char类型,但是char类型的长度小于int类型,所以报错。
解决思路:换成转换varchar类型,长度更大,结果不出错了。
参考资料:https://blog.51cto.com/jackin/5479327
情形二:
出错原因:convert(decimal(10,4), f_num/10000) f_num。字段定义长度(12,0),定义的转换长度小于数据的长度。
解决思路:转换后的长度改为16,4。convert(decimal(16,4), f_num/10000) f_num
参考资料:https://blog.csdn.net/weixin_45626288/article/details/132104224

排序null空值始终排在前边

原因:DM有一个参数ORDER_BY_NULLS_FLAG,默认值是0,0的话就是null始终在最前边,不管正序倒序。
解决思路:改变参数ORDER_BY_NULLS_FLAG的值:
0 表示 NULL 值始终在最前面返回;
1 表示ASC 升序排序时 NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回,在参数等于 1的情况下,NULL 值的返回与 ORACLE 保持一致;
2 表示 ASC 升序排序时 NULL 值在最前面返回,DESC 降序排序时 NULL 值在最后返回,在参数等于 2 的情况下,NULL 值的返回与MYSQL 保持一致
参考资料:https://blog.csdn.net/qq_27466979/article/details/127084933

存在集函数

原因:项目里有这样一个SQL
select 字段1,2,3...,
(select last_price from trading where trade_date = MIN(t.trade_date)) as price
from trading t where 条件1,2,3...
group by CONCAT(YEAR(t.trade_date), WEEK(t.trade_date))
要查询每周第一天的last_price,执行时报"存在集函数"的错,原来是在where条件里使用了MIN()函数,DM不允许这样使用,原因不明,如有错误欢迎指正。
解决思路:将MIN()函数改成了一个子查询,虽然比以前复杂了很多,查的也慢了,但是好在能执行了。

接口返回数据的时间与数据库中的时间不一致

项目中有个查询接口,返回的列表中某个时间类型的字段与数据库中执行SQL的日期差一天,并且不是所有数据都差一天。
出错原因:时区问题,字段存储的是时间戳,用FROM_UNIXTIME()函数转换格式返回给前台。由于在dm_svc.conf中错误的配置了TIME_ZONE=(+8:00),与数据库的时区不同,所以出现了这个问题。把该配置删掉就解决了。(MySQL数据库同理,在jdbc.url中可以配置时区)
参考资料:https://www.cnblogs.com/yangtsecode/p/12088284.html
dm_svc.conf使用相关资料:
https://blog.csdn.net/Cj12315/article/details/125383230
https://www.bilibili.com/read/cv18061917/

中文按汉语拼音排序

现象:期望中文字段zw按照汉语拼音排序,MySQL中使用order by CONVERT(zw, USING gbk) COLLATE gbk_chinese_ci函数,DM报错
解决方法:DM中有不同的函数来实现按汉语拼音排序order by NLSSORT(zw, ‘NLS_SORT=SCHINESE_PINYIN_M’)
参考资料:https://blog.csdn.net/lxm13613538669/article/details/126269847

字段名与系统关键字冲突

现象:诸如type top themetime等字段,查询时直接select type,top会报错,用这些字段排序时也会报错。
解决办法:给字段名(别名也需要)加上双引号,select s.“type” as “type” from user s order by “top”
参考资料:https://blog.csdn.net/qq_43421954/article/details/135018898

达梦数据库 -2723: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值

现象:t_user表的主键id设置为自增的,insert数据时给id设置了值 set id = 66,然后报了这个错。(MySQL就没这个问题)
解决办法:将该表的IDENTITY_INSERT设置为ON。貌似每次insert之前都要set一下,会话结束默认回复为off,这也太不方便了,有人知道更方便的解决办法吗?
SET IDENTITY_INSERT T_USER ON;
参考资料:https://www.cnblogs.com/miracle-luna/p/17772945.html
https://eco.dameng.com/community/question/20f934916987b5757be703efece7a560

GROUP_CONCAT()函数

现象:DM不支持GROUP_CONCAT()函数,DM里的对应函数是WM_CONCAT()
参考资料:https://blog.csdn.net/Odinpeng/article/details/131100174

Too big variables space

现象:有个任务需要大批量一次性插入数据,大概在1W条以上,然后DM报该错
参考资料:https://blog.csdn.net/weixin_60072306/article/details/135776040

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值