MySQL迁移达梦数据库注意事项

mysql<—>dm

mysql迁移到dm报错【错误消息: 不支持该数据类型】

mysql迁移到dm报错【错误消息: 不支持该数据类型】 | 达梦技术社区 (dameng.com)

更改迁移工具DM连接驱动.

这个驱动地址在安装包里面有,相对路径为:/drivers/jdbc,可以挑选最新的驱动。

imagepng

不支持直接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 函数

  1. 使用 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
  2. 使用 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
  3. 使用 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]])

自增存在差异

  1. 语法差异:在MySQL中,使用AUTO_INCREMENT关键字来定义自增列,而在达梦数据库中,使用IDENTITY关键字来定义自增列。

  2. 数据类型支持:MySQL的自增列可以应用于整数类型(如INT、BIGINT等),而达梦数据库的自增列只能应用于数值型(如NUMBER、DECIMAL等)。

  3. 自增起始值和步长:在MySQL中,可以通过设置AUTO_INCREMENT的起始值和步长来自定义自增列的行为。而在达梦数据库中,自增列的起始值默认为1,步长默认为1,无法直接修改

  4. 自增列的唯一性:在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

posted @ 2023-07-11 17:36  LiusCraft  阅读(1242)  评论(0编辑  收藏  举报