总体介绍

  • 人大金仓,是国产数据管理软件与服务提供商。主要服务于电子政务、党务、国防军工、金融、智慧城市、企业信息化等行业。在北京、上海、成都、天津等地设有研发和服务中心。
  • 我们公司主要做电子政务,包括政务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_dateto_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二次搜索文字位置,进行查看。
    在这里插入图片描述
    在这里插入图片描述
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐