当前位置: 首页 > news >正文

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm

文章目录

    • 达梦数据库(一)mysql2dm
    • 一、安装篇ForWindows
    • 二、数据库初始化篇
    • 三、数据迁移篇
      • 出现的问题
        • 找不到对应表或者视图
      • 注意
        • 字符集
        • 模式
        • 迁移出错
        • 大小写敏感
          • 解决方案
    • 四、 代码修改篇
      • group_concat
      • GROUP BY
        • 方法一
        • 方法二(最笨)
        • 方法补充
      • 多表联查更新
        • 参考
    • 五、参考

声明:

  1. 在windows上安装达梦数据库只是临时过渡使用

  2. 如未明确声明windows版本,皆为win10系统

  3. 项目背景为mysql数据迁移至达梦数据库

  4. 下文达梦数据库版本为 8

    要问具体的小版本号?问就是不知道。。。

    sql> select * from v$version;

    在这里插入图片描述

sql> select id_code;

在这里插入图片描述

当然你可以参照官方迁移文档:https://eco.dameng.com/document/dm/zh-cn/start/mysql_dm.html

一、安装篇ForWindows

  1. 下载安装包(需要登录),以下为官方系在地址。

    https://www.dameng.com/list_103.html

在这里插入图片描述

Please Note: 下载的软件安装包为压缩包,解压后如下所示,双击打开即可。

在这里插入图片描述

打开 .ios 文件后如下所示:

在这里插入图片描述

  1. 安装

    双击 setup.exe 安装即可

    (有些工具 在 /source/tool/ 也能用,但是有些不能用,建议还是安装较好)

二、数据库初始化篇

https://eco.dameng.com/document/dm/zh-cn/start/tool-dm-migrate.html

此链接为官方教程,不做过多赘述了,只在本文档中强调踩的坑。

三、数据迁移篇

在迁移前需要做准备工作,建议仔细阅读官方迁移文档。

出现的问题

找不到对应表或者视图

项目使用SYSDBA用户登陆。发现找不到对应表或者视图。

在达梦数据库中,如果登陆的用户有多个模式的权限,那么在查询的时候需要带上模式名。即 select * from moshi.table;

当然如果你的用户只有一个模式的权限那就不需要模式名了,直接查询即可。即 select * from table;

注意

字符集

达梦数据库在创建数据库实例的时候已经选择了字符集,在这个实例中创建的所有模式都是这个字符集。按照本文档使用的DM8版本,支持的字符集是UTF-8/GB18030/EUC-KR。(已经创建的是无法修改的,此处需要注意你的源数据库字符集 如 我的是UTF-8MB4 里面可能有表情,但是目标达梦是UTF-8)

select SF_GET_UNICODE_FLAG();
select  UNICODE ();
-- 执行以上命令可以在已经实例化的达梦数据库查看当前字符集。 0 表示 GB18030,1 表示 UTF-8,2 表示 EUC-KR

please note:UTF-8MB4下的 varchar(32) 可能对应的是 128位的字节数,但是UTF-8下的只是32位(理论上只能存储10个中文字符)。迁移过程中可能会出现超长。这个时候需要在迁移时修改对应映射的达梦数据库的表的字段精度。

模式

使用DM数据迁移工具迁移后,mysql的库对应的是达梦数据库的模式。

迁移出错

在使用DM数据迁移工具时有很多选项,建议仔细看看,按需选择,比如两个库字符长度不一致时。迁移时可以选择对应的表存在时先删除再继续操作。

大小写敏感

这东西很致命。模式/表名 查询时候的大小写等息息相关。

达梦数据库在数据库实例初始化的时候有个选项是是否大小写敏感,可以执行以下sql查询

select CASE_SENSITIVE();
-- 1 就是敏感

阿明酱啊 -【达梦8】大小敏感字符集参数设置,可以看看这篇文章。

概括为:

  • 大小写不敏感的实例中

    • DDL无论大小写不允许重复

    • 无论查询条件是否存在大小写,只要存在符合的相同结果都会被检索出来。

      搜索条件为大写如 (where name = “ZHANGSAN”) 会把 ZHANGSAN,zhangsan 都查出来。

  • 在大小写敏感的实例中

    • 若建表语句中表名并没用双引号括起来,则都会被转换成大写。若表名已经被双引号括起来,则表名保留双引号中的大小写形式。

      create table TEST.AAA

      create table TEST.aaa

      这俩最终建的表名都叫 AAA

      create table TEST.“aaa” 这个表名叫 aaa

      字段名同理。

    • 若建表语句中列名并没用双引号括起来,则都会被转换成大写。若列名已经被双引号括起来,则表名保留双引号中的大小写形式,且允许存在列名相同但大小写不同的列。

    • 查询条件严格按照结果的大小写来查询数据,若结果相同但大写不同,则不会出现在查询结果中。

      查询 AAA 只会查询到 AAA 查不出 aaa

    解决方案
    1. 大小写敏感环境中 表名/列名 保持默认(即 自动转为全部大写)

      sql查询时 表名或者列名 会自动转为 大写

      参考 第二层皮是也-达梦数据库大小写敏感设置及使用初探

    2. 初始化数据库设置为大小写不敏感

    3. 修改配置文件

      参考 达梦数据库的大小写敏感与CASE_SENSITIVE详解

四、 代码修改篇

group_concat

group_concat 改为wm_concat

GROUP BY

错误提示语:第1 行附近出现错误:不是 GROUP BY 表达式

方法一

原语句:

select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

修改后语句:

select /*+ GROUP_OPT_FLAG(1)*/ e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

添加了

/*+ GROUP_OPT_FLAG(1)*/

但是很遗憾,因项目代码中封装了分页语句,相当于在原本执行的sql外又套了一层,导致加的这段代码被包在内部子查询内。语句不生效。(如果你能找到源码中对sql进行最外层封装的地方,可以采用覆盖对应类的方式解决这个问题)

方法二(最笨)

原语句:

selecta.DEPARTMENT_ID as 部门编号,sum(SALARY)     as 部门工资,DEPARTMENT_NAME as 部门名称
fromTEST.EMPLOYEE a,TEST.DEPARTMENT b
where   a.DEPARTMENT_ID = b.DEPARTMENT_ID
group bya.DEPARTMENT_ID
having  sum(SALARY) > 80000
ORDER BYa.DEPARTMENT_ID;

现语句:

selecta.DEPARTMENT_ID as 部门编号,sum(SALARY)     as 部门工资,DEPARTMENT_NAME as 部门名称
fromTEST.EMPLOYEE a,TEST.DEPARTMENT b
where   a.DEPARTMENT_ID = b.DEPARTMENT_ID
group bya.DEPARTMENT_ID,DEPARTMENT_NAME
having  sum(SALARY) > 80000
ORDER BYa.DEPARTMENT_ID;

添加了:

ORACLE或者DMDB库中:GROUP BY后面必须加上你SELECT后面所查询的所有除聚合函数之外的所有字段(或者再加一层嵌套),但是这种方法,如果

  • 有的sql加了 *
  • 有的sql 嵌套了字查询
方法补充

参考 https://blog.csdn.net/qq_37898570/article/details/126951104

多表联查更新

参考
  • 帅ちいさい宝 csdn 玩转达梦の 多表关联更新改写

多是针对于多表联查有且只更新一个表的数据,而非多表联查更新多个表的数据。

五、参考

达梦数据库社区-技术分享

达梦数据库社区-技术专栏

相关文章:

  • Nvidia Isaac Sim代码编程 入门教程 2024(7)
  • HarmonyOS根据官网写案列~ArkTs从简单地页面开始
  • Spring中的IOC详解
  • docker安装指导
  • 【Day12】登录认证、异常处理
  • 基于JAVA+SpringBoot+Vue+uniapp的微信小程序点餐平台
  • C++案例三:猜数字游戏
  • 【QT】窗口|菜单栏|菜单项|工具栏|状态栏|浮动窗口
  • 详解Redis源码中的设计模式及设计思想
  • 【Apache Doris】周FAQ集锦:第 15 期
  • pyspark使用 graphframes创建和查询图的方法
  • Maven settings.xml 私服上传和拉取配置
  • 有效应对服务器遭受CC攻击的策略与实践
  • 鸿蒙特色物联网实训室
  • 【网络安全的神秘世界】Error:Archives directory /var/cache/apt/archives/partial is missing.
  • CentOS 7 防火墙操作
  • chrome扩展demo1-小时钟
  • crontab执行失败的多种原因
  • ES6语法详解(一)
  • ESLint简单操作
  • HTML5新特性总结
  • JAVA之继承和多态
  • Laravel核心解读--Facades
  • Linux CTF 逆向入门
  • Map集合、散列表、红黑树介绍
  • SpiderData 2019年2月13日 DApp数据排行榜
  • ViewService——一种保证客户端与服务端同步的方法
  • webgl (原生)基础入门指南【一】
  • 创建一种深思熟虑的文化
  • 分布式熔断降级平台aegis
  • 利用DataURL技术在网页上显示图片
  • 数据可视化之 Sankey 桑基图的实现
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MyCAT水平分库
  • 阿里云API、SDK和CLI应用实践方案
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #Linux(权限管理)
  • #pragma pack(1)
  • (145)光线追踪距离场柔和阴影
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C11) 泛型表达式
  • (Java入门)学生管理系统
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (实战篇)如何缓存数据
  • (四)linux文件内容查看
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (源码分析)springsecurity认证授权
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • . Flume面试题
  • .gitignore
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net 流——流的类型体系简单介绍
  • @Valid和@NotNull字段校验使用
  • [ A*实现 ] C++,矩阵地图