国产数据库人大金仓踩坑记录和函数适配
文章目录介绍注意事项(踩的坑)函数适配(持续更新)技巧介绍北京人大金仓信息技术股份有限公司(简称:人大金仓),是国产数据管理软件与服务提供商。人大金仓主要服务于电子政务、党务、国防军工、金融、智慧城市、企业信息化等行业。在北京、上海、成都、天津等地设有研发和服务中心,在全国设有分公司、办事处及代理机构,可提供7×24小时的本地化服务本次测试使用人大金仓V8版本程序使用java语言,hibernat
·
总体介绍
- 人大金仓,是国产数据管理软件与服务提供商。主要服务于电子政务、党务、国防军工、金融、智慧城市、企业信息化等行业。在北京、上海、成都、天津等地设有研发和服务中心。
- 我们公司主要做电子政务,包括政务OA和政府网站,目前很多省市的网站项目招标,都要求国产化适配,例如国产数据库金仓、达梦等、国产服务器东方通等。
- 本次测试使用人大金仓
V8
版本,为人大金仓最新版,我们公司和金仓公司有直接的技术对接。 - 项目程序使用java语言,使用hibernate5。
注意事项(踩的坑)
- 必须针对数据库名称,建立用户名,赋予权限。否则即使设置default_schema,hibernate在执行原生的sql时也会报错“
com.kingbase8.util.KSQLException: 错误: 关系 "cms_base_content" 不存在
”。例如项目数据库名project_oa
,则必须使用用户名为project_oa
连接。 - V8默认oracle风格,主键生成策略默认序列
SEQUENCE
,转库后需要手动添加序列hibernate_sequence
。我们是由mysql转金仓的,偏向于使用IDENTITY
策略。目前不支持根据配置选择默认主键策略,已将问题反馈给金仓开发人员,暂未提供根据配置筛选。 - 对现有数据库转库时,转库程序没有转换视图,视图需要手动添加
- 字符串判空问题,我们使用的版本金仓直接把空字符串当成null,这样在sql里使用
a = ''
判断空就会有问题。这个可以自己修改配置,来确定字符串的空值类型。需要改一下数据库data目录下的kingbase.conf
文件;添加 参数ora_input_emptystr_isnull=off
; 重启数据库 生效 - 针对mysql转金仓时,可能会将
tinyint
转为boolean
类型,导致程序报错,需要在金仓库里,将这些布尔类型,改为tinyint。可以在mysql里导出整个库的结构的sql,搜索tinyint,这样的字段应该不多。已经将问题反馈给金仓技术人员,暂未解决。 - 金仓支持oracle风格的
start with connect by
查询树形结构的数据,但是hibernate执行时有警告warn
,这个不影响查询结果,可以忽略 - 金仓sql不支持符号“`”,可以使用引号,或者不加符号。
- 金仓SQL对于GROUP BY比MySQL要求更严格,字段必须出现在 GROUP BY 子句中或者在聚合函数中使用,才可以在结果里展示
函数适配(持续更新)
- 总体来说,数据库适配过程中,需要对代码改动的,主要是不同的数据库对函数的支持不同,同一个函数或同一个功能,MySQL和Oracle的都可能不一样,此前代码对这两大主流数据库做了适配。此次金仓适配,比较耗时间的代码修改工作,也主要来自这个。
- 这个只是目前遇到的一部分,后续如果有新的函数适配,会继续更新
date_format
无法识别,但是to_date
、to_char
支持,需要使用oracle风格的写法trunc
处理日期函数,在金仓里不可以,需要使用date_trunc
SELECT date_trunc( 'day', TIMESTAMP '2020-7-13 11:30:35' ) - date_trunc( 'day', TIMESTAMP '2020-7-03 11:30:35' );
trunc
处理日期相减的值,不支持,可以使用to_number
SELECT to_number(date_trunc( 'day', TIMESTAMP '2020-7-13 11:30:35' ) - date_trunc( 'day', TIMESTAMP '2020-7-03 11:30:35' ));
datediff
函数不支持,可以使用to_number和date_trunc
结合使用
select to_number(date_trunc('day', ISNULL(b.reply_date,now())) - date_trunc('day', a.ADD_DATE))
- oracle 的
ifnull
需要使用ISNULL
- oracle 的
CONVERT
函数,金仓不支持,可以使用trunc
,但是这个需要给一个参数,表示小数位数
CONVERT (t.count / 5090 * 100,DECIMAL ( 15, 3 ))
改为trunc(t.count / 5090 * 100, 3)
技巧
- 对于金仓数据库支持的函数问题,或者SQL语法问题,可以在金仓数据库管理工具里的帮助文档里查看
帮助(H)
-帮助文档
,点击菜单即可查看文档。此文档是管理工具自带的,是金仓提供给开发人员或数据库管理员的帮助文档,你可以按照需要浏览或搜索,很多疑问都可以在此处得到解答。- 例如,针对
date_format
函数适用性,可以搜索文档,得到结果,发现不支持。可以继续搜索“日期格式”等关键词,去查找结果。对于得到的多条结果,可以点击左侧导航选择,再使用CTRL + F
二次搜索文字位置,进行查看。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献14条内容
所有评论(0)