MySQL表中如果字段类型是char,并且值的长度未达到char设定的长度,那么在做国产化数据库迁移时,会被空值补齐。针对这种情况,有两种解决办法。
方法一:迁移前,先将MySQL的字段类型进行修改,可以通过以下方式生成更新语句:
sqlSELECT CONCAT(
'ALTER TABLE `【数据库名】`.', TABLE_NAME, ' MODIFY ', COLUMN_NAME, ' VARCHAR(', CHARACTER_MAXIMUM_LENGTH, ');'
) 'sql'
FROM
information_schema.COLUMNS
WHERE TABLE_SCHEMA='【数据库名】' AND DATA_TYPE = 'char';
方法二:使用国产化数据库迁移软件时,设定以下类型转换 人大金仓的配置:
下载地址:https://www.kingbase.com.cn/download/c_id/455.html
引入驱动包
com.esen.jdbc kingbase8 8.6.0
application.yml的配置
driverClassName是: com.kingbase8.Driver
数据库连接地质是:jdbc:kingbase8://ip:54321/dbname
其他配置:
yml# Page Helper配置需要指定方言
pagehelper:
# 方 言
helperDialect: postgresql
# 需要指定数据库的模式和数据库类别,
lawyee:
database:
db-schema: 模式名
db-type: kingbase8
下载地址:https://www.dameng.com/view_61.html
find_in_set 的函数sqlCREATE OR REPLACE
FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')
RETURN NUMBER IS
l_idx number:=0; -- 用于计算piv_str2中分隔符的位置
str varchar2(500); -- 根据分隔符截取的子字符串
piv_str varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str
res number:=0; -- 返回结果
loopIndex number:=0;
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 THEN
IF piv_str = piv_str1 THEN
res:= 1;
END IF;
ELSE
-- 循环按分隔符截取piv_str
LOOP
l_idx := instr(piv_str,p_sep);
loopIndex:=loopIndex+1;
-- 当piv_str中还有分隔符时
IF l_idx > 0 THEN
-- 截取第一个分隔符前的字段str
str:= substr(piv_str,1,l_idx-1);
-- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断
IF str = piv_str1 THEN
res:= loopIndex;
EXIT;
END IF;
piv_str := substr(piv_str,l_idx+length(p_sep));
ELSE
-- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1
IF piv_str = piv_str1 THEN
res:= loopIndex;
END IF;
-- 无论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回res
RETURN res;
END FIND_IN_SET;
引入驱动包
com.dameng DmJdbcDriver18 8.1.1.193
application.yml的配置
driverClassName是: dm.jdbc.driver.DmDriver
数据库连接地质是:jdbc:dm://ip:54321/dbname
其他配置:
yml# Page Helper配置需要指定方言
pagehelper:
# 方 言
helperDialect: oracle
# 需要指定数据库的模式和数据库类别,
lawyee:
database:
db-schema: 模式名
db-type: dm
试用版下载地址:http://www.shentongdata.com/index.php/download/list-27
引入驱动包
com.shentong.jdbc oscarJDBC8 18
application.yml的配置
driverClassName是: com.oscar.Driver
数据库连接地质是:jdbc:oscar://ip:2003/dbname
其他配置:
yml# Page Helper配置需要指定方言
pagehelper:
# 方 言
helperDialect:
# 需要指定数据库的模式,
lawyee:
database:
db-schema: 模式名
无数据库下载地址。 相关工具下载地址:https://gbasedbt.com/index.php/gbase8s_tools.html
引入驱动包
com.gbase.dbdriver gbasedbtjdbc 3.3.0_2_36477d
application.yml的配置
driverClassName是: com.gbasedbt.jdbc.Driver
数据库连接地质是:jdbc:gbasedbt-sqli://[ip]:9088/[dbname]:GBASEDBTSERVER=[server name];DB_LOCALE=zh_CN.utf8;CLIENT_LOCALE=zh_CN.utf8;IFX_LOCK_MODE_WAIT=30
其他配置:
yml# 需要指定数据库的类型,
lawyee:
database:
db-type: gbasedbt-sqli
find_in_set 的函数drop function if exists find_in_set; create function find_in_set(str varchar(255),strlist lvarchar(10000)) returns int; define currp int; -- 当前位置 define lastp int; -- 上次位置 define sepnum int; define strlen int; define strtmp lvarchar(10000); let lastp = 1; let sepnum = 0; let strtmp = strlist || ","; -- 追加一个分隔符',' let strlen = length(strtmp); FOR currp = 1 TO strlen IF substr(strtmp,currp,1) = ',' THEN let sepnum = sepnum + 1; IF substr(strtmp,lastp,currp - lastp) = str THEN RETURN sepnum; END IF; let lastp = currp + 1; END IF; END FOR; RETURN 0; end function;
concat('%', #{itemName}, '%'))。在MyBatis的mapper中,尽量不要写成
concat('%', #{itemName}, '%')。 可以使用'%${itemName}%'(使用${}编写会存在sql注入的风险,需要注意处理.)。
使用
databaseId="gbasedbt-sqli"
insert into sys_role_power ( id, role_id, power_id, data_scope ) values (#{item.id}, #{item.roleId}, #{item.powerId}, #{item.dataScope}) insert into sys_role_power ( id, role_id, power_id, data_scope ) values (#{item.id}, #{item.roleId}, #{item.powerId}, #{item.dataScope})
本文作者:wucc
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!