达梦数据库的介绍以及适配MySQL转达梦过程中遇到的问题总结

安装

1、图形化安装

参照:https://eco.dameng.***/document/dm/zh-***/pm/install-uninstall.html#2.2.2.1%20%E5%9B%BE%E5%BD%A2%E5%8C%96%E5%AE%89%E8%A3%85

2、静默安装

输入命令:./DMInstall.bin -q 配置文件全路径
配置文件模板:https://eco.dameng.***/document/dm/zh-***/pm/dm8-appendix.html#5.2%20%E9%9D%99%E9%BB%98%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A8%A1%E6%9D%BF

3、命令行安装

参照:https://eco.dameng.***/document/dm/zh-***/pm/install-uninstall.html#2.2.2.2%20%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%AE%89%E8%A3%85

数据库工具介绍

DM管理工具

通过以下命令进入管理工具

[dmdba@localhost ~]$ cd /home/dmdba/dmdbms/tool/
[dmdba@localhost tool]$ ll
[dmdba@localhost tool]$ ./manager

对表空间、用户、模式的理解:
表空间就相当于是数据库,用户关联表空间,模式是被用户所拥有,每个用户有一个默认的同名的模式,访问自己模式下的表不需要加模式名,访问其他模式下的对象需要拥有访问权限,访问时还需加上模式名,且模式是表空间的一个映射,对表的操作都在模式中进行,表空间对模式是一对多的关系,如果没有建立表空间直接创建模式就会默认是SYSDBA

创建数据库流程
  • 先建立一个表空间,
  • 然后创建一个用户,设置用户名和密码,再授予权限,权限是可以对某个表空间进行操作,
  • 再将用户和表空间绑定,
  • 后续在模式下创建、修改、查看表等操作

DM数据迁移工具

进入tool文件夹中(同上)运行命令:

[dmdba@localhost tool]$ ./dts

1.新建工程
点击新建工程,输入工程名即可

2.新建迁移

3.填写数据源和目的源
url和驱动选择默认的即可

4.勾选迁移选项

5.指定迁移的模式
勾选创建模式他就会创建一个同名的模式名,也可以自行更改模式名

6.指定对象(即迁移的表)

7.通过预览可查看中文是否乱码

8.正常后点击下一步完成

9.迁移完成后可查看迁移报告

适配达梦后遇到的问题

1.基本差异

MySQL 达梦 说明
反引号 `` 支持 不支持 改成双引号"";若开启 CASE_SENSITIVE=1,则双引号也不允许,只能改别名
双引号 字符串常量 仅允许标识符 字符串统一用单引号 ’ ’
注释位置 可以在sql语句后面直接加 列级 ***ment 不支持 要单独出来,拆成 ***MENT ON TABLE/COLUMN IS 语句
字符集 可以在建表语句中指定 建表语句不能指定 在服务安装时选择字符集规范

2.数据迁移中文出现乱码问题

原因是原数据的字符集和现在的 DM 数据初始化的字符集不一致
例如:MySQL 用的是 UTF8MB4 字符集,迁移到 DM 数据库后中文乱码,DM 数据库目前不支持 UTF8MB4。但UTF8是可以的

3.数据类型和长度

char:
问题: 老版本的DTS工具从 MySQL 迁移到 DM,char 长度是原来的 3 倍,(新版本已修复)
从 MySQL 移植达梦,char 类型在 MySQL 不会自动空格补齐,达梦会自动空格补齐。可能会导致查询过程中不会自动过滤 char 类型中的空格,查询不到数据;
解决方案:
1、在数据迁移时,映射 char 类型为 varchar 类型;
2、通过 rtrim 函数把数据右边的空格清除掉

update 表名 set 列名1=rtrim(列名1);

varchar:
问题: MySQL中 varchar(1) 可以存一个汉字,DM 数据库是以字节为单位;达梦中 gb18030 字符集,varchar(2) 才可以存一个汉字;UTF-8 字符集,varchar(3) 才可以存一个汉字
解决方案: 将对应的字段类型修改为 varchar(32 char)(32 为实际 mysql 字段长度)。这样 DM 中实际存储的中文字符长度与 MYSQL 是一致的。

CREATE TABLE "KAUSB_TEST"."user"
(
"uid" VARCHAR(32 CHAR) NOT NULL,
"user_name" VARCHAR(255 CHAR) NOT NULL,
"password" VARCHAR(255) NOT NULL, --实际长度只有85
...

时间类型:
在 MySQL 中时间类型 TIMESTAMP 默认 default 设置为“0000-00-00 00:00:00”,而在 DM 中 TIMESTAMP 类型数据必须在 ‘0001-01-01 00:00:00.000000’ 到 '9999-12-31 23:59:59.999999’之间,“0000-00-0000:00:00”在 DM 中是不合法的


4.自增AUTO_INCREMENT:

问题: 在 MySQL 表结构默认值使用 AUTO_INCREMENT 函数来做自增长,达梦不支持,会报错
解决方案: 达梦数据库当前通过 IDENTITY(1,1)函数设置自增长,等效于 mysql 的 AUTO_INCREMENT

CREATE TABLE "KAUSB_TEST"."log_terminal"
(
"id" INT IDENTITY(1, 1) NOT NULL,
...

5.迁移 user 表到达梦后,无法查询表内容和插入数据:

USER 在 DM 数据库中属于关键字,在进行 SQL 查询时,需要用双引号括起来。
在插入语句失败时,需要检查表结构,了解是否含有自增列等特殊定义的字段。
除此之外,还有top、domain、***ment等,可以通过SELECT * FROM V$RESERVED_WORDS进行查询
若名称无法修改,用双引号包裹标识符或在 dm.ini 的 EXCLUDE_RESERVED_WORDS 参数中屏蔽对应关键字


6.聚合函数:

MySQL中用GROUP_CONCAT函数将多行数据合并成一行

SELECT GROUP_CONCAT(name ORDER BY id SEPARATOR ', ')
FROM users
GROUP BY department_id;

而达梦中没有此函数,需用LISTAGG代替

SELECT LISTAGG(name, ' ') WITHIN GROUP (ORDER BY id)
FROM users
GROUP BY department_id;

SELECT WM_CONCAT(name) -- 旧版本兼容
FROM users
GROUP BY department_id;

7.GROUP BY分组列:

分组列不能为集函数表达式或者在 SELECT 子句中定义的别名:

<select id="statistic3" resultType="java.util.Map">
    SELECT port_position, TO_CHAR(create_time, 'YYYY-MM-DD') ym, count(1) num
    FROM log_apply_permission
    WHERE TO_CHAR(create_time, 'YYYY-MM-DD') BETWEEN #{startTime} AND #{endTime}
    <if test="forwardList != null">
        AND forward_program_uid in
        <foreach collection="forwardList" item="uid" open="(" separator="," close=")">
            #{uid}
        </foreach>
    </if>
    GROUP BY port_position, TO_CHAR(create_time, 'YYYY-MM-DD') <!-- 这里不能用 ym 别名 -->
</select>

8.模糊查询不能省略ESCAPE:

在MySQL中可以不写ESCAPE,但是达梦中不能省略

SELECT * FROM "USER" where user_name LIKE '%operator\_%' escape '\'

9.代替MySQL的uuid()函数的是sys_guid:

达梦原生支持生成 UUID 的函数是 SYS_GUID()。两个函数都是生成一个全局唯一标识符,但MySQL返回的数据会有-,达梦没有

-- mysql
INSERT INTO secure_platform_assets (uid, object_uid, assets_status, create_time)
VALUES (REPLACE(uuid(), '-', ''), null,'1','1',now());
-- 达梦
INSERT INTO secure_platform_assets (uid, object_uid, assets_status, create_time)
VALUES (sys_guid(), null,'1','1',now());

10.不支持change修改列名:

达梦中用rename to来修改,且后面不能直接跟数据类型

--mysql
ALTER TABLE device_register CHANGE COLUMN device_register_forward_uid forward_uid varchar(32) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL ***MENT '设备注册站点' AFTER device_register_forward;
--达梦
ALTER TABLE device_register rename COLUMN device_register_forward_uid to forward_uid;
ALTER TABLE device_register MODIFY forward_uid VARCHAR(32);

11.返回值为整数转为BigDecimal

达梦查询返回后,Mybatis会将其映射为BigDecimal类型,而MySQL映射的为Integer类型,所以需要加CAST(... AS BIGINT)防止抛出抛 ClassCastException 异常

SELECT forward_auth,
 CASE
     WHEN uuid_serial_number = #{uuidSerialNumber} THEN 1
     WHEN uuid_serial_number = #{pidVidSerialNumber} THEN 2
     ELSE 0
     END AS checkSerialNumber,
	 FROM device_register WHERE uuid_serial_number = '111'
	 
--达梦需要转换
cast(
     CASE
     	WHEN uuid_serial_number = #{uuidSerialNumber} THEN 1
     	WHEN uuid_serial_number = #{pidVidSerialNumber} THEN 2
     	ELSE 0
     	END AS BIGINT) AS checkSerialNumber,
		 ...

12.不是group by表达式

group by子句中需要包含所有查询列,聚合函数除外

SELECT user_name,last_login_ip,SUM(type) 
FROM "user" 
GROUP BY user_name,last_login_ip --和上面的列保持一致

Tips:更多问题可以参照达梦的官方论坛和迁移问答
参考文献:https://eco.dameng.***/document/dm/zh-***/pm/index.html

转载请说明出处内容投诉
CSS教程网 » 达梦数据库的介绍以及适配MySQL转达梦过程中遇到的问题总结

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买