mysql迁移kingbase 解决出现的问题
前言
最近公司需要国产化数据库,mysql换成人大金仓(人大金仓版本是V8R6C7),这里记录一下出现的问题和解决方法
提示:以下是本篇文章正文内容,下面案例可供参考
一、金仓数据库没有DATE_FORMAT
//人大金仓:
//日期
to_date(Date,'YYYY-MM-DD HH24:MI:SS') //Date可为输入时间
//或
//字符串
to_char(Date,'YYYY-MM-DD HH24:MI:SS')//Date可为输入时间
1
2
3
4
5
6
二、mysql可以隐形转换,人大金仓不可以,需要自己转换
//金仓转换:
select created_at::date from user;
select created_at::varchar from user;
select cast(created_at as date) from user;
列名::date
列名::varchar
cast(列名 as date)
1
2
3
4
5
6
7
8
三、人大金仓配置:如何关闭group by 强制检测
show sql_mode; 查看
set sql_mode = ‘ONLY_FULL_GROUP_BY’; 是开启group by检测
关闭强制检测 如下:
/opt/Kingbase/ES/V8/data (我这里是默认安装!!!)
全局永久设置 可以在 kingbase.conf 文件中最后一行添加以下参数:
sql_mode = ‘’
当前会话,只是临时生效 可以在数据库中输入
set sql_mode = ‘’;
四、数据迁移的时候出现无效的utf-8编码,如何解决
kingbase.conf配置文件最下边增加此命令:ignore_char_null_check=true,重启数据库后生效
迁移完成后,注释掉此命令
五、金仓直接把空字符串当成null,如何解决
例子:select * from sys_depart where parent_id = ‘’
在客户端连接工具执行:show ora_input_emptystr_isnull,发现结果是on,即配置了“空字符串默认被转为NULL”导致查询结果异常。在kingbase.config配置文件中修改ora_input_emptystr_isnull=off
六、人大金仓数据库应设置大小写敏感问题
在安装数据库时,默认是大小写敏感的(enable_ci = off),其特性如下:
1) 没有使用界定标识符(双引号)引起来的表名、列名,会默认转为小写。
2) 使用界定标识符引起来的表名、列名,将以引起来的大小写进行存储(引号里面的字符全部是大写或者小写默认转换成小写),以及后续的查询匹配。
kingbase大小写不敏感的特点
在安装时,如果选择了(enable_ci = on),则数据库会被初始化为大小写不敏感。大小写不敏感的表现:
1) 在创建表时,没有使用界定标识符(双引号)引起来的表名、列名,默认以当前输入的大小写进行存储,查询时也以全小写进行匹配。
2) 在查询时,没有使用界定标识符(双引号)引起来的表名、列名,默认都转为小写进行匹配。
3) 使用界定标识符引起来的表名、列名,将以引起来的大小写进行存储,以及后续的查询匹配。
比较和总结
不管大小写敏感与否,使用双引号引起来的表名、列名,都是按照引起来的大小写进行匹配。只有不使用界定标识符时有很大的差异。
七、人大 语句 ||的问题
mysql 用的|| 人大金仓需要 or 替换 || 才可以
八、kingbase没有replace into ,需要merge into替换
//批量插入
MERGE INTO bis_device_station_status b
USING (
<foreach collection="list" item="item" index="index" separator="union all">
(SELECT
#{item.station_id} AS station_id, #{item.online_status} AS online_status, #{item.dbm} AS dbm
FROM DUAL
)
</foreach>
) s
ON (b.station_id = s.station_id)
WHEN MATCHED THEN
UPDATE SET b.online_status = s.online_status, b.dbm = s.dbm
WHEN NOT MATCHED THEN
INSERT (b.station_id, b.online_status, b.dbm) VALUES (s.station_id, s.online_status, s.dbm);
//单个插入 on 作为判定条件 相同就修改,不相同就插入
MERGE INTO bis_device_station_status b
USING (SELECT #{item.station_id} AS station_id, #{item.online_status} AS online_status, #{item.dbm} AS dbm FROM dual) s
ON (b.station_id = s.station_id)
WHEN MATCHED THEN
UPDATE SET b.online_status = s.online_status, b.dbm = s.dbm
WHEN NOT MATCHED THEN
INSERT (b.station_id, b.online_status, b.dbm) VALUES (s.station_id, s.online_status, s.dbm);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
九、人大金仓添加SUBSTRING_INDEX函数
CREATE OR REPLACE FUNCTION substring_index(varchar, varchar, integer)
RETURNS varchar AS $$
DECLARE
tokens varchar[];
length integer ;
indexnum integer;
BEGIN
tokens := pg_catalog.string_to_array($1, $2);
length := pg_catalog.array_upper(tokens, 1);
indexnum := length - ($3 * -1) + 1;
IF $3 >= 0 THEN
RETURN pg_catalog.array_to_string(tokens[1:$3], $2);
ELSE
RETURN pg_catalog.array_to_string(tokens[indexnum:length], $2);
END IF;
END;
$$ IMMUTABLE STRICT LANGUAGE PLPGSQL;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
十、mysql 中isnull(kpi_seq)适配kingbae
修改:kpi_seq isnull
十一、kingbase取反 和mysql取反
mysql:
!(isnull(su.phonenumber) || su.phonenumber='')
kingbase:
not(su.phonenumber isnull or su.phonenumber='')
1
2
3
4
十二、kingbase与mysql 的boolean 的区别
kingbase 当为真的时候是true 假为false
mysql 当为真的时候是1 假为0
mysql实例:
!(isnull(su.phonenumber) || su.phonenumber='') phone_valid
kingbase 实列:(三元)
case when not (su.phonenumber isnull or su.phonenumber = '')
then 1 else 0 END AS asphone_valid
1
2
3
4
5
6
7
8
十三、如何开启mysql的一些兼容模式
kingbase连接客户端 最下方有个管理
十四、人大金仓如何去掉 模式名.xxx
在配置文件中设置
jdbc.url=jdbc:kingbase8://ip:端口/数据库名?currentSchema=模式名
十五、金仓数据库中没有find_in_set函数 需要自己创建
CREATE OR REPLACE FUNCTION find_in_set(str text, strlist text) RETURNS int
AS
DECLARE b1 VARCHAR;
begin
b1:=array_position(string_to_array($2, ','),$1);
RETURN b1;
end;
1
2
3
4
5
6
7
十六、人大金仓配置: 数据库中存在表sys_user,人大金仓数据库存在系统表sys_user,表冲突导致代码中查询的时候查的是系统表sys_user,而不是我们建的表。
解决方法:设置普通用户忽略系统表。system登录数据库,执行:
alter system set search_path = “$USER”, PUBLIC,SYS_CATALOG;
select sys_reload_conf(); #这个语句是让上面的命令生效的。
总结
这边是最近适配人大金仓出现的问题和解决方法,后续还会一直补充人大金仓出现的问题和解决方法!
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_65779214/article/details/131230858