教程栏目

joomla中文网出品的官方教程

人大金仓数据库的客户端工具中自带有数据库迁移工具。下一步,我们需要将Joomla使用的mysql数据库中的数据表和数据全部迁移到人大金仓中。

迁移数据


人大金仓的数据库迁移工具是有图形界面的。首先需要新建两个数据库的链接。一个是需要迁移的mysql数据库的链接。另外一个是目标数据库人大金仓的链接。在初次迁移的时候肯定会出现很多的错误,在多次尝试后最终完成了整个数据库的迁移,其中的艰辛可谓一言难尽。在此将一些踩过的坑记录一下,希望能帮助后来者。

下图是迁移数据成功后的截图:

如何设置数据库参数


要设置人大金仓的数据库参数,需要有如下步骤:

  • 在终端中切换到一个特定的用户,这个用户在安装数据库的时候执行。在我的测试环境中这个用户是kingbase.
  • 执行命令  ksql -h 192.168.2.241 -p 54321 -U SYSTEM -W 123456 -d TEST 进入到数据库的管理界面。
  • 为了方便兼容mysql,需要对数据库进行一些设置。
  • 每次修改参数,都应该执行一次重载系统参数

设置系统参数:

alter system set ignore_char_null_check=on; //其中ignore_char_null_check 是参数名, on是参数值

查看系统参数:

show case_sensitive;//其中case_sensitve是参数名

重新加载设置:

在数据库终端执行命令: select sys_reload_conf();

执行成功的结果:

 sys_reload_conf 
-----------------
 t
(1 row)

大小写敏感的问题


大小写敏感的设置,直接关系到后续迁移的成败。依据我个人的经验,在初始化人大金仓数据库的时候务必将大小写敏感设置为否。如果你初始化的时候设置为大小写敏感,建议直接重装人大金仓数据库。大小写敏感的问题不单单人大金仓有,达梦数据库也有同样的问题。

更多关于人大金仓大小写敏感的问题,请参考文章:KingBaseV8人大金仓数据库 | 大小写敏感问题

tinyint的问题 


人大金仓在迁移mysql的时候,如果发现数据表字段的类型为tinyint(1)的时候会自动的转换为bool类型,将原先的数值0,1使用true,false替换。这在joomla中将导致严重的问题。因为很多底层的查询语句直接是使用“1”来判断的,最明显的一个是published字段。

解决的方案有两种

  1. 在迁移前将mysql字段类型调整为smallint。
  2. 在创建mysql数据库链接的时候,增加一个参数设置。将tinyInt1isBit设置为false.如图:

relation "PRIMARY"already exists 创建数据库对象失败的问题


解决的方法就是勾选"自动转换对象名"。如图:

0000-00-00 00:00:00 日期转换问题


人大金仓的数据库中0000-00-00 00:00:00为非法时间会使用Null代替,这样当插入记录中有0000-00-00 00:00:00,且该字段为Not Null的时候会导致插入失败,提示非空约束。典型的错误信息如下:

CST ERROR:  null value in column "checked_out_time" violates not-null constraint

 解决方法有两种:

  • 修改相应的字段类型,移除掉非空约束
  • 在创建mysql数据库链接的时候,增加一个参数设置。将zeroDateTimeBehavior设置为round.如图:

这样设置之后所有的0000-00-00 00:00:00 会转换为 0001-01-01 00:00:00.0。

保留关键词的问题


在适配的过程中发现提示如下的错误信息:CONNECT BY clause required in this query block 。经过分析,发现查询字段中有level字段,这个字段是被人大金仓保留的。

解决方案:

设置数据库参数:exclude_reserved_words='level';如果有多个参数,可以使用逗号分隔。

update inner join的问题


在Joomla实现排序的时候,使用了update inner join这种语法,在人大金仓中是不被支持。

解决的方案:

修改人大金仓数据库查询类,对update inner join这种语句进行拦截,然后做对应的替换。目前我只想到了此类方法。

case when的问题


在迁移成功后,打开文章详情的时候出现如下的错误:

最开始还以为这个问题是CONCAT_WS引起的。最后经过分析,发现引起问题的CASE WHEN语句。这主要是因为人大金仓数据库类型不支持隐式转换。CASE WHEN中需要的是字符串,但最后的ELSE 分支给出的结果是c.id 这是 INTEGER类型。

解决的方案:

显示的转换类型,将c.id 转为c.id::text

更多的关于问题


更多的问题请参考:人大金仓数据库 与 mysql 的 sql 差异对比 与 导入数据

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前