当前位置:   article > 正文

国产化适配迁移记录_迁移适配

迁移适配

国产化适配迁移记录

  • 本项目基于RuoYi-Vue的框架进行迁移。
  • 目前已完成覆盖测试暂无其他问题。

国产化环境

名称版本
达梦数据库DmJdbcDriver18 8.1.2.144
通用mapper – tk.mybatismapper-spring-boot-starter 4.2.5
			<!-- 达梦数据库-->
            <dependency>
                <groupId>com.dameng</groupId>
                <artifactId>DmJdbcDriver18</artifactId>
                <version>8.1.2.141</version>
            </dependency>
            
            <dependency>
			    <groupId>tk.mybatis</groupId>
			    <artifactId>mapper-spring-boot-starter</artifactId>
			    <version>4.2.2</version>
			</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

技术文档支持

达梦官网
达梦产品下载
达梦官方技术社区
达梦技术指南
Linux 安装
Windows 安装

Mysql数据迁移

已进行测试数据:基础平台开发库基础表数据和结构部分无损迁移
使用DM数据迁移工具 --> 新建工程 --> 右键迁移目录节点 --> 新建迁移
涉及截图较多,随后再添加吧,挺简单的,遇到的问题都在下面写着呢

项目配置更改

数据源配置

#yml切换配置  
#mysql  
driverClassName: com.mysql.cj.jdbc.Driver  
#达梦  
driverClassName: dm.jdbc.driver.DmDriver  
  • 1
  • 2
  • 3
  • 4
  • 5

已知问题

  1. 解决 FIND_IN_SET函数问题
CREATE 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;
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  1. 解决数据库模式名问题
#数据库模式名配置
mydb:
  myDatabaseSchemaName: scctest.
  • 1
  • 2
  • 3
@Configuration
public class MyBatisConfig {
    /**
     * 数据库模式名
     */
    @Value("${mydb.myDatabaseSchemaName}")
    private String myDatabaseSchemaName;
     /**
     * 数据库模式名key
     */
    private final static String DATABASE_SCHEMA_NAME = "myDatabaseSchemaName";
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        
		Properties pro = new Properties();
        pro.setProperty(DATABASE_SCHEMA_NAME, this.myDatabaseSchemaName);
        sessionFactory.setConfigurationProperties(pro);
     }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
#sql写法
select * from ${myDatabaseSchemaName}sys_user 
#实际效果
select * from scctest.sys_user 
  • 1
  • 2
  • 3
  • 4
  1. 出现-2106: 第1 行附近出现错误:无效的表或视图名[xxxxx]
    先检查是否存在该表或视图,如果存在,尝试增加模式名。使用时建议当前访问用户的用户名和数据库模式名保持一致,能减少迁移中的该问题出现频率。
  2. 不是 GROUP BY 表达式
    所有通用关系型数据库标准语法都是这样的,SELECT子句中的列名必须为分组列或列函数,列函数对于GROUP BY子句定义的每个组各返回一个结果。对该语句oup.project_id,op.project_name字段均为分组列必须包含在GROUP BY中,如果不需要对project_name字段进行分组,那么需要在select中去掉该字段,如果又需要查询出project_name字段的值,可以考虑使用子查询的方式。

其他常见问题预检查

  • 字符串转换异常 建议检查错误:- 传入数字类型,数据库为字符串 在系统运行时会出现该错误,在达梦控制台执行sql无异常;
  • GROUP_CONCAT 替换函数 WM_CONCAT
  • 禁止使用Mysql的 ` 分隔符来标记特殊字段
  • 主键字段建议如下标记:
    • @Id 标记id字段
    • @KeySql(useGeneratedKeys = true) 标记插入时返回自增主键ID ,封包通用mapper时使用
    • @Column(insertable = false) 插入时不传入主键(通用mapperch插入时默认是id =null,达梦数据库不支持),非自增可不添加该注解
  • 数据库迁移时请优先在mysql数据库将datetime类型字段修改为timestamp,减少迁移过程中时间问题引发的异常错误
  • 低版本tk.mybatis和dm驱动包可能引起更新时封包数据异常(表现为主键Id数值异常)达梦官网我提出的相关问题描述 建议使用文章开头列举的版本可以解决该问题
  • SET IDENTITY_INSERT 表名 ON; 用这个sql来解决主键不允许修改,或者不允许指定主键值的问题。官方列举说可能是针对此次链接有效。目前个人测试是一直有效。暂时无法验证准确性
  • sp_set_para_value(1,‘ENABLE_BLOB_CMP_FLAG’,1); 此sql来解决大字段排序问题。
  • 查询时如果 字符串类型传入 int类型数据可能会引起异常

2023年2月14日 补充问题

关于varchar类型使用问题

  1. 处理达梦数据库varchar类型数据超长后自动截断数据问题:
    将该参数MY_STRICT_TABLES设置为1,可以在插入数据长度超过列的长度值时,提示报错。
  2. 字段长度与字符长度问题
    使用varchar类型 10位长度。
    使用默认配置:
    只能输入3位中文或者10位英文数字。
    修改配置后:
    实际测试可以输入40位英文或数字。13位中文。

在这里插入图片描述

以下区域内内容来源为达梦官方“大房子”和“破烂换钱勒”用户提供
影响varchar类型长度的有两个关键的初始换参数选项:
1、字符集:CHARSET/UNICODE_FLAG 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
2、LENGTH_IN_CHAR:VARCHAR类型长度是否以字符为单位(N),可选值:Y/N,1/0;
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/691957
推荐阅读