文章目录
简介
现有一个已经以mysql作为数据源的项目,由于需要适配一套信创环境,这里将达梦数据库选作关系型数据库,本文主要介绍如何从mysql适配到达梦。达梦官网地址
安装下载
安装包地址 https://eco.dameng.com/download/
连接配置
这里使用阿里的数据库链接池druid以及达梦提供的数据驱动包进行数据库连接
pom文件
<dependency><groupId>com.dameng</groupId><artifactId>dm-jdbc</artifactId><version>1.8</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.20</version></dependency>
application.yml配置
spring:datasource:type: com.alibaba.druid.pool.DruidDataSource
druid:driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:35236/SBOM1?serverTimezone=Asia/Shanghai
username: TECENT_VIDEO
password: 12345678901QWER
initial-size:10max-active:100min-idle:10max-wait:60000pool-prepared-statements:truemax-pool-prepared-statement-per-connection-size:20time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000validation-query: SELECT 1 FROM DUAL
test-while-idle:truetest-on-borrow:falsetest-on-return:falsefilter:stat:log-slow-sql:trueslow-sql-millis:1000merge-sql:falsewall:config:multi-statement-allow:true
代码适配
这里以mybatis为例,重新复制一份mapper文件到新目录,配置文件直接将sql方法的实现指向该新目录,接着将xml里面的sql按照达梦的语法方式适配,大多数情况是不需要改写的。
改写的方法可以参照本文注意事项中提到的事项点
注意事项
mysql适配达梦数据库时,有许多语法和函数需要我们去留意适配,本章内容总结了一些主要的问题处理方案,基本可以满足大家的适配需求,若有更多的问题,可以到达梦社区搜索->达梦社区
1、创建表结构语法
创建表的时候,不支持在列的后面直接加comment注释,使用
COMMENT ON IS
代替,如下:
CREATETABLE role_biz_t
(
account_id BIGINTNOTNULL,
role_id BIGINTNOTNULL,PRIMARYKEY(account_id, role_id)-- 在达梦数据库中,不需要指定USING BTREE,因为B树索引是默认的)STORAGE(INITIAL 64,NEXT64);COMMENTONTABLE role_biz_t IS'前台用户角色关系表';
2、索引名唯一问题
mysql中我们对索引的唯一性限制在某张表,但是达梦索引名字的唯一性是限制范围是整个模式,所以创建索引的时候最好加上表名来保证唯一性
CREATEINDEX idx_aa_code_create_user ON aa_code(create_user);CREATEUNIQUEINDEX idx_sca_lib_uk_license_id ON sca_lib("license_id");
3、新增字段
新增字段和创建表的时候,不支持在列的后面直接加comment注释,同样使用使用
COMMENT ON IS
代替,如下:
ALTERTABLE test_item_t ADD service_name varchar(100)DEFAULTNULL;COMMENTONCOLUMN test_item_t.service_name IS'服务名称';
4、切换模式名
在mysql中我们常常用
USE database_name;
来完成切换数据库,但是实际上达梦切换模式的语法不是这个。
解决方案:
-- TECENT_VIDEO是模式名 表示切换到该模式下,类似与mysql的切换库SETSCHEMA TECENT_VIDEO;
5、工具客户端更新数据
在一些常见的工具客户端执行插入或更新数据时,记得在末尾加上
commit;
否则你会发现表中数据并没更新。
UPDATE sca_lib SET grade_a=-1WHERE grade_name='未知';commit;
6、group by语法
mysql group by后面可以填写查询后的结果别名,但是达梦必须得跟上原本的字段名
解决方案:
SELECT t1.developer as mydeveloper,t1.id as myid
FROM test t1
groupby t1.developer,t1.id
7、加解密函数替换
若原本mysql 用的是AES_DECRYPT(UNHEX(phone),密钥) ,则需要替换成达梦特有的加解密函数,如下
-- 插入一条数据INSERTINTO TASK (cust_id,cust_name,sex)VALUES(12225,
BINTOCHAR (
UTL_ENCODE.BASE64_ENCODE (
DBMS_CRYPTO.ENCRYPT(
UTL_I18N.STRING_TO_RAW ('李四','UTF8'),
DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
UTL_I18N.STRING_TO_RAW ('2112122121212121222','UTF8')))),1);-- 模糊查询select*from TASK t where
UTL_I18N.RAW_TO_CHAR (
DBMS_CRYPTO.DECRYPT (
UTL_ENCODE.BASE64_DECODE (
CHARTOBIN ( cust_name)),
DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
UTL_I18N.STRING_TO_RAW ('2112122121212121222','UTF8')),'UTF8')like'%李四%';
8、删除符号`
达梦sql不支持符号` 需要去掉,否则会报语法有误,处理的范围包括实体类、代码中的sql拼接以及xml文件
解决方案:
SELECT developer id FROM test
-- 或者SELECT developer id FROM"test"
9、separator分隔替换成LISTAGG函数
解决方案:
select LISTAGG(field_name ,',')as fieldName from sys_dict_detail_t
10、函数now()替换成SYSDATE()
now()函数在达梦不存在,需要替换成SYSDATE()
INSERTINTO sys_job (create_time, update_time)VALUES( sysdate(), sysdate());
11、函数GROUP_CONCAT替换成wm_concat
解决方案:
SELECT wm_concat(app.id)as scaIds FROM task app
12、函数STR_TO_DATE替换成TO_DATE
解决方案:
SELECT*FROM task t
where(t.start_time between TRUNC(TO_DATE('2024-07-28','YYYY-MM-DD HH24:MI:SS'))and TRUNC(TO_DATE('2024-08-28','YYYY-MM-DD HH24:MI:SS'))+1)
13、函数替换 CURDATE()
解决方案:
DATE_FORMAT(create_time,'%Y-%m-%d')>= CURDATE()-INTERVAL1DAY
替换成
DATE_FORMAT(create_time,'%Y-%m-%d')>= DATE_FORMAT(SYSDATE -1,'YYYY-MM-DD')
14、函数ANY_VALUE()替换成FIRST_VALUE
解决方案:
select FIRST_VALUE(id)as aid from sca_app_component_license
groupby license_str
15、函数REGEXP()替换成REGEXP_LIKE
解决方案:
select*from task_fun_item_t where REGEXP_LIKE(code_url,'^[0-9]+$');
16、函数 if 替换成COALESCE
解决方案:
SELECT
t1.developer,COALESCE(t1.first_vul_json ==null, t1.last_vul_json, t1.first_vul_json)AS vul_json
FROM task_vul_repair_statistic_t t1
17、空值排序问题
达梦使用order by对存在空值的列项排序时,会出现升序空值在前,降序 空值在后,这个和我们平时在使用musql默认的排序规则不一致
解决方案:
登录sysdba用户修改,或者直接修改dm.ini 文件:将配置参数
ORDER_BY_NULLS_FLAG
修改为2
可以通过查询语句查询配置项目参数,如下
SELECT para_name,para_type,para_value FROM V$DM_INI WHERE PARA_NAME ='ORDER_BY_NULLS_FLAG';
ORDER_BY_NULLS_FLAG 参数说明
控制排序时 NULL 值返回的位置,取值 0、1、2。
0 表示 NULL 值始终在最前面返回;
1 表示ASC 升序排序时 NULL 值在最后返回,DESC 降序排序时 NULL 值在最前面返回, 在参数等于 1的情况下,NULL 值的返回与 ORACLE 保持一致;
2 表示 ASC 升序排序时 NULL 值在最前面返回,DESC 降序排序时 NULL 值在最后返回, 在参数等于 2 的情况下,NULL 值的返回与MYSQL 保持一致
版权归原作者 码至终章 所有, 如有侵权,请联系我们删除。