官方系列教材 - 数据库适配

实战如何让joomla迁移在国产数据库

人大金仓数据库与 mysql 的 sql 差异对比与导入数据。

反引号与双引号


kingbase不支持mysql中的 反引号 与其相对应的是 双引号

mysql中的语法:`name`
kingbase中的语法:"name"

正则表达式


kingbase 正则表达式 与mysql中 的语法不通 :

mysql 中的语法:`name` regexp '^b.*'
kingbase 中的语法:regexp_like("name",'^b.*','i')

字符串包裹


kingbase 与 mysql 字符串差别 mysql中可以使用单引号与双引号包裹 字符串 kingbase只能使用 单引号包裹

mysql 中的语法:insert into users(name,context) values('name',"context")
kingbase 中的语法:insert into users(name,context) values('name','context')

类型转换


kingbase不支持类型的隐式转换不通类型中必须手动转换
mysql 支持类型的隐式转换

GROUP_CONCAT


kingbase中与mysql的GROUP_CONCAT 相同的方法是 wm_concat  用法和参数都一样

replace into


mysql 中 replace into 是根据 唯一约束 进行查找 如果有数据 删除并且插入新数据,没有则直接插入数据。
kingbase 中没有 replace into 需要使用 merge into 替换。 其语句执行结果是: 根据输入的字段作为条件如果含有则修改,没有则插入

具体替换件如下sql:

单字段条件:

merge into "account" a using (select 'acco0004' as account_code) b on (a.account_code = b.account_code)
when matched then update set "name" = 'hello world'
when not matched then insert ("account_code","name") values ('acco0004','hello')

解释:

  • 1."account" 为源表名(要被修改数据的表)
  • 2.(select 'acco0004' as account_code) b 判断重复的虚拟表 其中 'acco0004' 为判断依据(根据实际状况替换) account_code 为自定义字段名 可根据实际状况修改
  • 3.on (a.account_code = b.account_code) 过滤条件 如果 account 表中含有 虚拟表b中 acco0004 的值则进行修改操作 account_code 可根据实际状况修改 可使用and连接多个字段 但字段必须 有唯一约束
  • 4.update set "name" = 'malong' 如果有则需改 这里只修改了 name 可根据增加替换
  • 5.insert ("account_code","name") values ('acco0004','bailong') 如果没有则进行插入

多字段条件:

merge into "account" a using (select 'acco0001' as account_code ,'keyc0001' as key_code) b 
on (a.account_code = b.account_code and a.key_code = b.key_code)
when matched then update set "name" = 'hello world'
when not matched then insert ("account_code","name","key_code") values ('acco0001','hello','keyc0001')

insert ignore into:


mysql 的 insert ignore into 没有数据则插入,有则忽略。

kingbase 没有 insert ignore into 可替换为以下sql:

语句跟replace into差不多 只是缺少了修改:

merge into "account" a using (select 'acco0002' as account_code) b on (a.account_code = b.account_code)
when not matched then insert ("account_code","name") values ('acco0002','hello')

DATE_FORMAT :


kingbase 中的to_char函数与mysql中date_format对应,但第二位的参数有所不同

FIELD:


kingbase中没有 field 函数 要实现此形式提供以下示例参考:

mysql 语句:

SELECT * FROM account ORDER BY FIELD(`name`,'suyoupeng','liushaopeng','huxue','hongjinbao','malong')

kingbase 语句:

SELECT * FROM account ORDER BY case when name = 'suyoupeng' then '0' when name = 'liushaopeng' then '1' when name = 'huxue' then '2' when name = 'hongjinbao' then '3' when name = 'malong' then '4' else name end ,name

Tips:其中 then 后面的值 需要根据 字段 name 的类型进行调整, kingbase 不支持隐式数据转换

concat:


由于kingbase的双引号代表包含字段 如果想让concat以单引号包含字符可以使用以下语法 也兼容mysql

SELECT CONCAT('''','bailong','''')

group by:


kingbase 使用SQL3以前的标准所以在 group by 与mysql的语法相同:

mysql 中group by 用法:

SELECT id,`name`,age,birthday FROM account WHERE age BETWEEN 20 AND 50 GROUP BY `name` ORDER BY birthday

如果在kingbase中也达到同样的结果 请转换为以下的sql

select id,name,age,birthday from casecheck.account where id in (select max(id) from casecheck.account where age between 20 and 50 group by name ) order by birthday desc

解释:

在kingbase使用group by 必须将显示的字段多键入到group by中。这样的话就导致了数据的不准确

在上面的sql语句中 select max(id) from casecheck.account where age between 20 and 50 group by name 如果 id 不使用聚合函数 max 包裹将会报错,

可能的原因是 group by name字段以后 一个name 对应多个id 此时sql引擎不知道应该显示哪个,使用max聚合函数后 sql 就取最大的id的name了。

得到所有符合条件的id后,再以此做为条件 重新检索数据表。

INET_ATON:

mysql 使用例子:

SELECT INET_ATON('192.168.1.90') AS ip

kingbase 不支持 INET_ATON函数 用以下sql替换

select 
    to_number(regexp_replace(ip, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\1')) * 16777216 +
    to_number(regexp_replace(ip, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\2')) * 65536 +
    to_number(regexp_replace(ip, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\3')) * 256 +
    to_number(regexp_replace(ip, '([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})', '\4'))  as ip_number
from
    (SELECT '192.168.1.90' AS ip)

数据导入:


应该分为两步操作。首先导入表结构后 再导入数据 同时导入可能索引创建不成功


参考链接:https://www.jianshu.com/p/ef6b7d1ba8f8


作者: 樱木花道

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

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级