先放文档:https://eco.dameng.com/docs/zh-cn/start/index.html
达梦-我国第一个数据库公司的产品,拥有全部源代码,具有完全自主知识产权,用现在的话说就是“国货之光”,近几年终于从众多国产数据库中脱颖而出。

开场白讲完了,开始讲MySQL到达梦。
首先,你要有一个MySQL数据库啊。
嗯,其次还要有一个达梦数据库啊。
当然还需要一个达梦的Windows客户端,当你安装好达梦客户端的时候,你就同时拥有了这些工具。

然后呢,打开【DM数据迁移工具】。他支持的源端数据类型大概是这些:

然后新建一个工程,再新建一个迁移,再再按照提示去做迁移,嗯,然后在你迁移的过程中可能就会遇到报错了。
其实想写迁移过程的,但是好像没什么难度,参考官方文档吧:
https://eco.dameng.com/docs/zh-cn/start/tool-dm-migrate.html
讲讲你可能遇到的报错或者问题吧。
1.字符集编码及大小写是否敏感问题
首先啊,非常重要啊!如果你的编码搞错了,或者是大小写敏感搞错了,那就只能从头再来了,因为达梦不支持动态修改这两个参数。
关于字符集编码:MySQL里面常用的UTF8和UTF8mb4字符集,在达梦中均使用UTF8字符集即可。(达梦中的UTF8字符集是4字节的)
关于大小写敏感:如果MySQL里面是大小写敏感的,建议提前与用户沟通,是否MySQL端就需要改为大小写不敏感的,因为迁移后对于大小写敏感的达梦数据库,小写表名、列名等都需要用双引号引起来,这样对应用端的改动就会比较大了。
关于大小写敏感的介绍还可以参考这里:
2.达梦的保留字与标识符
达梦的保留字是非常多的,可能在迁移Oracle的时候体会更明显,因为Oracle会有大量的存储过程,在迁移过程中就会遇到:
[-2007:错误消息: 第 x行, 第 x 列[KEYWORD]附近出现错误:语法分析出错]
这个就是因为存储过程中用了达梦的关键字或保留字做变量或者表名、列名等,这个时候的解决方案就是给这个关键字加上双引号。达梦中关键字的查询:
select * from V$RESERVED_WORDS;
在MySQL中可能遇到的问题是:MySQL对表的命名并不严格,允许使用数字和特殊符号作为开头,但是在达梦中是不建议的,所以对于这种表,迁移到达梦里面后,查询也是需要带双引号的。

3.迁移报错:Streaming result set com.mysql.jdbc...

这个报错的讨厌之处在于,报错以后,后面的任务会提示成功,但是数据导入是0,其实就是没把数据迁移成功,但是又告诉你任务成功了,然后你兴高采烈的告诉用户数据迁移成功了,用户上去看了告诉你没数据,嗯,很开心。
好吧,目前只在MySQL 5.6版本遇到过这个问题,而且是偶发的,就是如果你接着执行一次重迁出错任务,是有可能能成功的。
目前的解决办法是换个驱动包可以解决,驱动包用的是:mysql-connector-java-5.1.48.jar,可能是驱动的问题吧。
建议:希望达梦可以根据用户选择的数据库版本,自动选择最优的驱动包,不需要用户手动指定驱动包,或者可以在官方文档中给出每个版本数据库在数据迁移中建议使用的驱动包版本。
4.时间戳问题
MySQL支持时间戳:0000-00-00 00:00:00 (虽然没意义)
达梦支持的最小时间戳是:0000-01-01 00:00:00 (可能稍微有点意义)
奇怪的知识又多了一点。
5.索引、约束问题
MySQL里面支持在同一列或者组合列上建多个索引,但是达梦不允许。会报错:[-3236:此列列表已存在索引]
这种情况就把这个错误跳过吧。
建议:DM迁移工具增加跳过错误的功能,不然下次点击重迁出错对象的时候还会再出现在重迁对象里面,其实我是想跳过的。对于表比较多的情况就很难受了....
6.char 和 varchar的问题
达梦数据库初始化的时候可以指定一个参数:
LENGTH_IN_CHAR=1
关于 LENGTH_IN_CHAR 的介绍:

这里可能会遇到的问题:源端MySQL,使用char(1)存储性别,如“男”,但是到达梦端,char(1)是存不下“男”的,varchar(1)可以,或者char(3) 可以,这种情况就需要提前判断,提前做转换的,比如这样:

一般还可以顺便转换一些达梦端不支持的类型,比如json等。
7.关于存储过程、触发器
达梦不支持迁移MySQL的存储过程和触发器,需要用户手动迁移。
(小声嘀咕:但是支持迁移Oracle的存储过程和触发器,哼。)
以上分享来自于MySQL迁移达梦过程中遇到的问题,仅供参考,来自于忘记自己还有公众号这回事,时隔一年以后才更新的假公众号博主。
8.mysql-达梦字段类型对比(部分)
| MySQL端类型 | 达梦端类型 |
| bigint | BIGINT |
| bit | BIT |
| blob | BLOB |
| char | VARCHAR |
| date | DATE |
| datetime | TIMESTAMP(0) |
| decimal | DEC |
| double | FLOAT |
| int | INT |
| longtext | CLOB |
| mediumblob | BLOB |
| mediumtext | TEXT |
| text | TEXT |
| time | TIME(0) |
| timestamp | TIMESTAMP |
| tinyint | TINYINT |
| varchar | VARCHAR |
over~~




