金仓数据库字段_金仓数据库KingBase8迁移SQL问题汇总

mysql数据库迁移到人大金仓数据库问题记录清单
https://blog.csdn.net/xiaoxiangzi520/article/details/117961513

人大金仓数据库V7版本安装后修改大小写敏感与不敏感
安装后修改需要重新初始化data【安装路径例如:D:\Program Files\Kingbase\ES\V8\data】

如果有数据备份一下数据

停服务

删除data文件夹,在cmd执行如下语句【SYSTEM:用户名 123456:密码】

iinitdb -E UTF-8 -D “D:\Program Files\Kingbase\ES\V8\data” -U SYSTEM -W SYSTEM --case-insensitive
如果提示:找不到命令 就把C:\Kingbase\ES\V7\bin\initdb这个命令拖到cmd里

1>
命名需要加 as 关键字;

2> 别名不能加mysql自动生成斜单引号,中文别明不能加单引号;

3> 当mysql某个字段的类型为 tinyint时,且长度为1,迁移到金仓时,自动转换为 true 或 false;(需要讲tinyint改为2,才可以保持一样的数值,对应类型为Integer);

4> 计算时,需要将varchar类型转换为Decimal类型,才可以与1.000000023去加减乘除;

例如: cast(IF(score,0) as DECIMAL) * 0.10000000000000016

5> 使用 left join 时进行关联查询,每个联表后 用 on 连接 关联条件;不允许联表后用 on 关联所有不同表的关联条件;

6> 报错信息:Cause: com.kingbase8.util.KSQLException: ERROR: CASE types TEXT and NUMERIC cannot be matched

CASE

WHEN ‘string’ is NULL THEN

‘–’ Else IF ( ROUND( 0.0003, 2 ) = 0, 0.01::varchar, ROUND( 0.0003, 2) )END AS ‘alias’

// 前后都为字符串,类型需要保持一致

7>,伪列 (rownum)

SELECT

FROM

(

SELECT

t1.*,

rownum - 1 orderNum //rownum-1 从 0开始,rownum 从1开始

FROM

(

SELECT

r.uid nameId,

r.uid uid,  //这个地方不允许别名与原字段一样

‘company’ AS LABEL // 常量命名需要加 AS 关键字

FROM

risk_confilict_legal r

LEFT JOIN company_graph_risk_analy p ON r.uid = p.pfr_id

WHERE

( p.list_time BETWEEN ‘19901001’ AND ‘20301031’ OR list_time IS NULL )

ORDER BY

IF

( LEFT ( r.valueone, 3 ) != LEFT ( r.valuetwo, 3 ), 0, 1 )

LIMIT 100000000

) t1

) result

8>,mysql :select 10 DIV 2;-》kingbase8:select 10 / 2;

9>,mysql:

UPDATE company_score cs,

( SELECT prvt_org_cde, IF ( ( 25+100 * score ) > 96, 96, ( 25+100 * score ) ) AS score FROM tencent_every_company_scores ) tencent

SET cs.stmt_score = tencent.score

WHERE

tencent.prvt_org_cde = cs.company_name

Kingbase8:

UPDATE company_score cs

SET cs.stmt_score = tencent.score

FROM ( SELECT prvt_org_cde, IF ( ( 25+100 * (score::DECIMAL) ) > 96, 96, ( 25+100 * (score::DECIMAL) ) ) AS score FROM tencent_every_company_scores ) tencent

WHERE

tencent.prvt_org_cde = cs.company_name

或者:

UPDATE company_score cs

SETcs.stmt_score =(

SELECT IF((25 + 100 * (score::DECIMAL))> 96,96,(25 + 100 * (score::DECIMAL))) AS score

FROM tencent_every_company_scores

WHERE prvt_org_cde = cs.company_name

)

WHEREEXISTS(

SELECT 1 FROM tencent_every_company_scores

WHERE prvt_org_cde = cs.company_name)

10)数据库类型不支持异常:dbType not support : null, url jdbc:kingbase8。

解决方法:

数据源配置

spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: admin
        loginPassword: 123456
    dynamic:
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        filters: stat,wall,slf4j
        ```
        去掉filters中的wall配置,改为: filters: stat,slf4j   。

(11)数据源连接拒绝异常:com.kingbase8.util.KSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

解决方法:数据源中的url: jdbc:kingbase8:192.168.132.11:54321/test,改为:jdbc:kingbase8://192.168.132.11:54321/demo。少了“//”会读取默认配置,即:host=localhost,port=5432。

(12) 表数据字段存在空字符串,但是无法查询到该条数据。如查询语句:

select * from sys_depart where parent_id = '',没有返回查询结果。

解决方法:在客户端连接工具执行:show ora_input_emptystr_isnull,发现结果是on,即配置了“空字符串默认被转为NULL”导致查询结果异常。在kingbase.config配置文件中修改ora_input_emptystr_isnull=off,保存并重启数据库:sys_ctl restart。

(13) 数据库中存在表sys_user,人大金仓数据库存在系统表sys_user,表冲突导致代码中查询的时候查的是系统表sys_user,而不是我们建的表。

解决方法:设置普通用户忽略系统表。system登录数据库,执行:

alter system set search_path = "$USER", PUBLIC,SYS_CATALOG;

select sys_reload_conf();  #这个语句是让上面的命令生效的。

(15)mysql中某张表字段类型为tinyint(1),使用人大金仓数据迁移工具迁移后该字段类型变为BOOLEAN,导致代码中的Integer字段无法转换数据类型报错。

解决方法:方法1:代码中的Integer字段类型改为boolean,这样在mysql和人大金仓数据库都能正确映射值。方法2:人大金仓数据迁移工具迁移数据时设置tinyint类型映射转换使用tinyint类型。

(16)数据类型转换错误,字符串转为无符号整型时失败。Mysql能使用如下语句能执行成功:
SELECT max(cast(querry_no AS UNSIGNED )) AS querry_no

FROM querry_list WHERE querry_no LIKE CONCAT('test','%')

但是在人大金仓数据库中异常:com.kingbase8.util.KSQLException: 错误: 类型 "UNSIGNED" 不存在。

解决方法:修改为:SELECT max(cast(querry_no AS INTEGER)) AS querry_no

FROM querry_list WHERE querry_no LIKE CONCAT('test','%') 。

(17)字符串格式时间转换异常。字段ZHYXQ的值为:2030-05-01T07:54:10.843Z格式,需要转为:2030-05-01 07:54:10.843。Mysql执行如下语句能正常执行:

Select FROM_UNIXTIME(ZHYXQ) as ZHYXQ from sys_user;

但是在人大金仓数据库中异常:SQL 错误 [42883]: 错误: 函数 FROM_UNIXTIME(CHARACTER VARYING) 不存在。Hint: 没有匹配指定名称和参数类型的函数。

解决方法:原因为人大金仓不存在FROM_UNIXTIME函数。修改为:

Select cast(ZHYXQ as TIMESTAMP) as ZHYXQ from sys_user;

或者Select to_timestamp(ZHYXQ,'yyyy-mm-dd hh24:mi:ss.us') as ZHYXQ from sys_user。
 
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值