MySQL迁移达梦数据库注意事项
mysql<—>dm
mysql迁移到dm报错【错误消息: 不支持该数据类型】
mysql迁移到dm报错【错误消息: 不支持该数据类型】 | 达梦技术社区 (dameng.com)
更改迁移工具DM连接驱动.
这个驱动地址在安装包里面有,相对路径为:/drivers/jdbc,可以挑选最新的驱动。
不支持直接comment注释
创建表的时候,不支持在列的后面直接加 comment 注释,使用 COMMENT ON IS 代替,如:
COMMENT ON TABLE xxx IS xxx COMMENT ON COLUMN xxx IS xxx
不支持 date_sub 函数
使用 dateadd(datepart,n,date) 代替
其中,datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n), second(ss,s), millisecond(ms) 例子:
select dateadd(month, -6, now()); select dateadd(month, 2, now());
不支持 date_format 函数
-
使用 datepart 代替:语法:datepart(datepart, date),返回代表日期的指定部分的整数
datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n),second(ss,s), millisecond(ms) 例子:
select datepart(year, '2018-12-13 08:45:00'); --2018 select datepart(month, '2018-12-13 08:45:00'); --12 -
使用 date_part 代替,功能和 datepart 一样,写法不同,参数顺序颠倒,且都要加引号
select date_part('2018-12-13 08:45:00', 'year');--2018 select date_part('2018-12-13 08:45:00', 'mm'); -- 12 -
使用 extract 代替,语法:extract(dtfield from date),从日期类型date中抽取dtfield对应的值 dtfield 可以是 year,month,day,hour,minute,second 例子:
select extract(year from '2018-12-13 08:45:00'); --2018 select extract(month from '2018-12-13 08:45:00'); --12
不支持 substring_index 函数
使用 substr / substring 代替,
语法:
substr(char[,m[,n]])
substring(char[from m[ for n]])
自增存在差异
-
语法差异:在MySQL中,使用AUTO_INCREMENT关键字来定义自增列,而在达梦数据库中,使用IDENTITY关键字来定义自增列。
-
数据类型支持:MySQL的自增列可以应用于整数类型(如INT、BIGINT等),而达梦数据库的自增列只能应用于数值型(如NUMBER、DECIMAL等)。
-
自增起始值和步长:在MySQL中,可以通过设置
AUTO_INCREMENT的起始值和步长来自定义自增列的行为。而在达梦数据库中,自增列的起始值默认为1,步长默认为1,无法直接修改。 -
自增列的唯一性:在MySQL中,自增列的值在表中是唯一的,不允许重复。而在达梦数据库中,默认情况下自增列的值在表中是唯一的,但可以通过设置IDENTITY列的属性来允许重复值。
若插入时触发:-2723: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值
开启/关闭当前自增列插入:SET IDENTITY_INSERT <表名> on(开启)/off(关闭)
jdbc url中指定数据库名(schema)
JDBC URL属性为:schema,
指定用户登录后的当前模式,默认为用户的默认模式。
JDBC URL为:jdbc:dm://ip:port?schema=模式名
不支持 str_to_date|date_format 函数
达梦不支持 mysql中的str_to_date和date_format函数(字符串转时间类型的函数与时间类型转字符串),在DM中可以使用 to_data与to_char函数代替。
date_format(date,'%Y-%m-%d') ————–>oracle中的to_char(); str_to_date(date,'%Y-%m-%d') ————–>oracle中的to_date()
to_char函数可格式化时间文本格式与数字格式。
T在SQL查询中格式化输出日期和数字非常有用,可以根据需要灵活地定义输出格式。
# 时间 SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM dual; # 数值 SELECT TO_CHAR(12345.67, '9,999.99') FROM dual;
日期格式占位符有变化
平时用yyyy MM mm dd 等...表示。
在dm里应该是:mi是分钟 mm是月
然后hh后面跟上12或24来代表12小时制和24小时制:hh12 hh24
jdbc连接上设置genKeyNameCase来列名的大小写(注意)
调用 preparedStatement(String sql, String[] columnName)接口 prepare sql 时可同时指定列名,用于在表数据增删改后返回指定的列值。该参数用于指定这里的列名的大小写。取值 0/1/2 或 none/upper/lower;缺省为 upper。
0 或 none:保持用户输入不变;
1 或 upper: 将用户输入转为大写;
2 或 lower: 将用户输入转为小写
MySQL跟达梦中在''中使用\进行转义的问题
达梦中不支持'adawd'fgdrgdg' ===> 'adawd'fgdrgdg'
需要更改成:'adawd''fg'
MySQL与达梦字符占位大小不同
经排查,该表的NAMES字段存放的是中文,MYSQL中使用的是UTF8编码。 在MySQL 中 varchar(1) 可以存一个汉字,DM 数据库是以字节为单位。gb18030 字符集,varchar(2) 才可以存一个汉字;UTF-8 字符集,varchar(3) 才可以存一个汉字。该names在MYSQL的长度为10,在迁移过程中,达梦数据库建表的names字段长度也是10,那么就会导致当该字段中文字符超过4个的时候,就会出现无法存下的问题。
dm修改自增字段时要注意
如果修改的表字段是自增的需要删除该字段的自增:
执行:ALTER TABLE <表名> DROP IDENTITY
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!