1. 达梦数据库理解及安装 1.1 达梦数据库是基于模式的 达梦数据库是基于模式的(具体我也不太清楚,感兴趣的可以自己研究),创建一个用户就会创建一个模式,这里的模式有点类似于Mysql中库的概念。 如果用当前用户访问当前用户同名的模式下的
达梦数据库是基于模式的(具体我也不太清楚,感兴趣的可以自己研究),创建一个用户就会创建一个模式,这里的模式有点类似于Mysql中库的概念。
如果用当前用户访问当前用户同名的模式下的表,可以直接访问,如TEST_A用户访问user表:
select * from user;
如果是TEST_B用户想访问TEST_A模式下的user表就需要通过模式.表名访问:
select * from TEST_B.user;
直接看官网文档:https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html
mysql 同样如此,也需要驱动包来连接 Mysql,只不过 SpringBoot 对 MySQL 做了集成,没有对达梦数据库做集成,所以,我们需要自己引入驱动包,这个驱动包通过 Maven 仓库是下载不了的
由于我们之前是安装了达梦数据库(DM8)的,然后我们在其安装目录下是可以找到驱动包的
这三个驱动包分别对应的是 jdk 的版本,我用的是 JDK 1.8 的,所以我选择的是 DmJdbcDriver18.jar 驱动包,将其放在 resources\lib\ 目录下
然后我们在 pom.xml 文件中,引入该文件
<dependency> <groupId>com.dmgroupId> <artifactId>DmJdbcDriver18artifactId> <version>1.8version> <scope>systemscope> <systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jarsystemPath>dependency>
spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://192.168.0.196:5236/mid_exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8 username: admin passWord: admin
至此,配置基本上完成。
启动后报错:dynamic-datasource Please check the setting of primary
这是因为我们本来的项目中配置了多数据源,我使用多数据源配置如下:
spring: # Mysql配置 datasource: dynamic: druid: initial-size: 5 min-idle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 filters: stat,slf4j connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 primary: base datasource: base: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://192.168.0.96:5236/mid_exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8 username: test_user password: crea_2020
启动服务后,由于配置了定时任务(quartz框架),读取定时任务配置文件,去查看定时任务时,报错找不到定时任务相关配置表,我这边用的是quartz.properties
注意:由于达梦是可以设置大小写不敏感的,所以不用在意大小写(注意在初始化库时设置),但是!!!注意!!!达梦访问表都是模式.表名访问,模式名即mysql的库名。
所以这里需要修改:
问题二已经说了,达梦可以不区分大小写,但是访问表需要用模式.表名访问,如:
# mall为模式名即mysql中的库名# user为表名select * from mall.user;
官方文档地址:Https://eco.dameng.com/document/dm/zh-cn/pm/insertion-deletion-modification.html#5.4%20MERGE%20INTO%20%E8%AF%AD%E5%8F%A5
达梦数据库是不支持ingore根据索引存在就不插入的语法的。这里可以通过使用merge into来解决这个问题。如:
# mysql中:insert ignore into g_classify_entity (classify_id, entity_id) values (1,1);# dameng中:merge into mid_exam.g_classify_entity a using (select classify_id,entity_id from (select 1 as classify_id,2 as entity_id) tmp) bon (a.classify_id = b.classify_id and a.entity_id = b.entity_id)WHEN NOT MATCHED THEN INSERT (classify_id, entity_id) values (1,2);
官方文档地址:https://eco.dameng.com/document/dm/zh-cn/pm/function.html#8.5%20%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%87%BD%E6%95%B0
这是因为我在原来的sql中使用了,CAST(value as char),达梦数据库中的char是定长的(mysql中也是定长),官方文档中有一句话:定义 CHAR 类型的列时,可以指定一个不超过 32767 的正整数作为字节长度,例如:CHAR(100)。如果未指定长度,缺省为 1
,这里可能是默认长度为1,所以报了长度溢出数据丢失。
所以这里我们应该使用varchar作为数据转换类型。(mysql中也应该使用varchar,记得要改一下)
官方文档地址:https://eco.dameng.com/document/dm/zh-cn/pm/check-phrases.html#4.1.4.3.8%20WM_CONCAT%20%E5%87%BD%E6%95%B0
达梦数据库不支持使用group_concat,更不用说group_concat(a, ‘,’),这里可以用wm_concat代替。
由于wm_concat只能用’,'拼接,所以我们还需要replace一下。
# mysql中用法:GROUP_CONCAT(qua.user_answer SEPARATOR '!,');# 达梦中用法:replace(WM_CONCAT(qua.user_answer ),',', '!,')
--可以利用达梦数据库内置的员工表测试select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;---------报错信息---------------总共1个语句正依次执行...[执行语句1]:select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;执行失败(语句1)-4080: 第1 行附近出现错误:不是 GROUP BY 表达式1条语句执行失败
直接在查询中添加参数:
##达梦支持灵活的处理方式,可以直接在查询中加hint参数。select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;101马学铭72424102程擎武21592103郑吉群129443104陈仙75945105金纬194399201李慧军45299202常鹏程20491204谢俊人81014301苏国华112344..............
##也可以修改dm.ini参数GROUP_OPT_FLAG=1,动态,会话级参数,不用重启数据库。select para_name,para_value,file_value from v$dm_ini where para_name='GROUP_OPT_FLAG';##sp_set_para_value(1,'GROUP_OPT_FLAG',1);select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;101马学铭72424102程擎武21592103郑吉群129443104陈仙75945105金纬194399201李慧军45299202常鹏程20491204谢俊人81014301苏国华112344...............
#达梦还可以配置兼容参数,COMPATIBLE_MODE=4,静态参数,需要重启数据库后生效!sp_set_para_value(2,'COMPATIBLE_MODE',4);select para_name,para_value,file_value from v$dm_ini where para_name='COMPATIBLE_MODE';#!!注意修改后需要重启数据库!!select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;101马学铭72424102程擎武21592103郑吉群129443104陈仙75945105金纬194399201李慧军45299202常鹏程20491204谢俊人81014301苏国华112344...............
#COMPATIBLE_MODE参数解释:0: 不兼容1:兼容 SQL92 标准2: 部分兼容 oracle3: 部分兼容 MS SQL SERVER 4: 部分兼容 MYSQL5:兼容 DM66: 部分兼容 TERADATA
使用 GROUP BY 要注意以下问题:1.在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列。分组列的数据类型不能是多媒体数据类型;2.分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;3.当分组列值包含空值时,则空值作为一个独立组;4.当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;5. GROUP BY 子句中至多可包含 255 个分组列; 6. ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。
达梦数据库应该是不支持if判断函数,这里我们可以用case when代替
如:
if(a > 0, a, 0);====>>>>case when a > 0 then a else 0 end
可能达梦是不支持"`"符号标注字段的,直接查询字段名就行,在mysql中字段名和关键字名称相同可能会有问题,所以需要标注。
在DM8上对大字段类型列进行排序、分组等操作时,会报错-2685:试图在blob或者clob列上排序或比较。
create table T (ID int ,C1 TEXT);INSERT INTO T VALUES(1,'新华社北京12月5日电 题:步履坚定,共绘高质量发展新篇章——各地贯彻党的十九届六中全会精神纪实新华社记者发展,是解决一切问题的总钥匙。党的十九届六中全会审议通过《中共中央关于党的百年奋斗重大成就和历史经验的决议》强调,必须实现创新成为第一动力、协调成为内生特点、绿色成为普遍形态、开放成为必由之路、共享成为根本目的的高质量发展。近日新华社记者奔赴多地,到企业车间、基层一线、群众当中,亲历贯彻全会精神的火热气象,感受落实新发展理念蔚然成风。提质增效,跃上发展新台阶走进济钢集团,黑色钢铁已不见踪影。36岁的技术人员陈书超身着白大褂,正操作数控机床加工直径几微米的精密零部件。对于转型发展,他有着切身收获:“企业从‘靠钢吃饭’到‘无钢发展’,我的工作也从铸造‘大黑粗’变成加工‘高精尖’,环境好了,收入也高了。”2017年,有着60年历史的济钢关停全部钢铁生产线。如今,济钢度过转型阵痛,向新材料、高端装备制造转型。2021年,集团产值预计和退出钢铁产能前相当,但能耗、大气污染物排放均只有以前的“零头”。“要努力提升技能,适应企业转型的新需要,以实际行动响应全会关于推动高质量发展的号召。”陈书超说。');COMMIT;
select c1,count(*) from T group by c1;SELECT ID,C1 FROM T ORDER BY C1;
参数说明:
将数据库参数ENABLE_BLOB_CMP_FLAG设置为1后,数据库支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。
ENABLE_BLOB_CMP_FLAG: 是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。
注意:该参数并不能支持GROUP BY 对大字段进行处理。
# 将ENABLE_BLOB_CMP_FLAG参数设置为1sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);
新开会话,执行order by SQL语句
执行group by SQL语句:group by 语句还是会报错,报错信息为"[-6116]:无法比较的数据类型."
通过上面测试,GROUP BY 无法通过修改ENABLE_BLOB_CMP_FLAG参数来支持,所以需要将对应的大对象列转换为字符串类型进行处理。
使用CAST将字段类型转换为字符串类型:
SELECT ID,CAST(C1 AS VARCHAR) FROM T ORDER BY CAST(C1 AS VARCHAR);SELECT CAST(C1 AS VARCHAR), COUNT(*) FROM T GROUP BY CAST(C1 AS VARCHAR);
可以观察到,通过CAST将大字段列转换为字符串类型之后,ORDER BY 、GROUP BY 操作均可以执行。
DBMS_LOB.SUBSTR函数对CLOB或者TEXT类型,返回的结果为字符串类型,具体细节请参考《DM8 系统包使用》。
SQL语句如下:
SELECT ID,DBMS_LOB.SUBSTR(C1) FROM T ORDER BY DBMS_LOB.SUBSTR(C1);select DBMS_LOB.SUBSTR(C1),count(*) from T group by DBMS_LOB.SUBSTR(C1);
可以观察到,使用DBMS_LOB.SUBSTR函数后,对于ORDER BY 、GROUP BY 操作均可以执行。
官方文档:https://eco.dameng.com/document/dm/zh-cn/pm/function.html#8.3%20%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%87%BD%E6%95%B0
使用DATEDIFF代替。
#mysql中:select TIME_TO_SEC(timediff('2022-04-15 16:57:20', '2022-04-15 16:57:16'));# 达梦中:select datediff(second, '2022-04-15 16:57:16', '2022-04-15 16:57:20')
达梦数据库不支持date_sub函数,可以用DATEADD(MINUTE, -5, now())
来完成。
#mysqlselect date_sub(now(),interval 5 minute)# 达梦:select DATEADD(MINUTE, -5, now())
设置为自增的列,要在字段上添加type = IdType.AUTO
@TableId(value = "practice_question_id", type = IdType.AUTO)private Long practice_question_id;
来源地址:https://blog.csdn.net/weixin_39724194/article/details/127632374
--结束END--
本文标题: 达梦数据库使用配置及问题整理
本文链接: https://lsjlt.com/news/375479.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0