达梦数据库(一)mysql2dm
文章目录
声明:
在windows上安装达梦数据库只是临时过渡使用
如未明确声明windows版本,皆为win10系统
项目背景为mysql数据迁移至达梦数据库
下文达梦数据库版本为 8
要问具体的小版本号?问就是不知道。。。
sql> select * from v$version;
sql> select id_code;
当然你可以参照官方迁移文档:https://eco.dameng.com/document/dm/zh-cn/start/mysql_dm.html
一、安装篇ForWindows
-
下载安装包(需要登录),以下为官方系在地址。
https://www.dameng.com/list_103.html
Please Note: 下载的软件安装包为压缩包,解压后如下所示,双击打开即可。
打开 .ios 文件后如下所示:
-
安装
双击 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
解决方案
-
大小写敏感环境中 表名/列名 保持默认(即 自动转为全部大写)
sql查询时 表名或者列名 会自动转为 大写
-
初始化数据库设置为大小写不敏感
-
修改配置文件
-
四、 代码修改篇
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进行最外层封装的地方,可以采用覆盖对应类的方式解决这个问题)
方法二(最笨)
原语句:
select
a.DEPARTMENT_ID as 部门编号,
sum(SALARY) as 部门工资,
DEPARTMENT_NAME as 部门名称
from
TEST.EMPLOYEE a,TEST.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by
a.DEPARTMENT_ID
having sum(SALARY) > 80000
ORDER BY
a.DEPARTMENT_ID;
现语句:
select
a.DEPARTMENT_ID as 部门编号,
sum(SALARY) as 部门工资,
DEPARTMENT_NAME as 部门名称
from
TEST.EMPLOYEE a,TEST.DEPARTMENT b
where a.DEPARTMENT_ID = b.DEPARTMENT_ID
group by
a.DEPARTMENT_ID,DEPARTMENT_NAME
having sum(SALARY) > 80000
ORDER BY
a.DEPARTMENT_ID;
添加了:
ORACLE或者DMDB库中:GROUP BY后面必须加上你SELECT后面所查询的所有除聚合函数之外的所有字段(或者再加一层嵌套),但是这种方法,如果
- 有的sql加了 *
- 有的sql 嵌套了字查询
方法补充
参考 https://blog.csdn.net/qq_37898570/article/details/126951104
多表联查更新
参考
多是针对于多表联查有且只更新一个表的数据,而非多表联查更新多个表的数据。