mysql和DM区别

2024年 4月 26日 54.8k 0

反引号与双引号

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 anda.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)

数据导入:

应该分为两步操作

首先导入表结构后 在导入数据 同时导入可能索引创建不成功

导入表结果如下图:

加入json类型映射:

结构导入完毕再执行数据导入 (如下图):

报错问题定位:

导入数据报错合集:

ERROR: invalid byte sequence for encoding “UTF8”: 0x00
tips:含有中文的数据都有可能出现此错误

解决方式如下:

在源数据库表中找到报错数据

SELECT * FROM law_item WHERE text LIKE CONCAT("%",CHAR(0),"%");

重新以对应的编码输入文字即可。

没有找到数据类型:json请增加数据类型映射

加入json类型映射即可。

tips:在数据导入中已有解决办法
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/BuildH/article/details/120059843

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论