由于本人负责的JAVA应用一直使用MYSQL,最近为了国产化,走信创路线,公司觉得向DM8迁移,适配该应用,在迁移过程中,遇到了几个MYSQL转DM8的兼容性问题,特此在这里与大家分享,希望对各位开发工程师有帮助。
JDBC
<!-- 添加 dm8 jdbc jar 包依赖 -->
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>${dm8.version}</version>
</dependency>
链接字符串信息:
url: jdbc:dm://192.168.xxx.xxx:XXXX/
username: 新建用户名
password: 密码
driver-class-name: dm.jdbc.driver.DmDriver
数据库配置相关
DM默认不支持CLOB、BLOB大字段进行比较(mysql Text类型字段会默认转成CLOB),该参数表示是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。
sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);
解决group by报错
也可以修改dm.ini参数GROUP_OPT_FLAG=1,动态,会话级参数,不用重启数据库。
sp_set_para_value(1,'GROUP_OPT_FLAG',1);
SQL相关(以mysql为对比)
// 以下语句通过判断数据源是mysql/DM/pgsql来实现不同的处理。
SELECT
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')=='com.mysql.cj.jdbc.Driver'">
GROUP_concat(url)
</if>
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name') == 'dm.jdbc.driver.DmDriver'">
WM_CONCAT(url)
</if>
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')=='org.postgresql.Driver'">
STRING_AGG(url,',')
</if>
from sys_xtxx
// mysql使用“ ` ”标记括起来,表示字段,而DM的同保留字字段名必须用双引号括起来\
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name') == 'dm.jdbc.driver.DmDriver'">
"TO" = #{to},
</if>
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name') != 'dm.jdbc.driver.DmDriver'">
`to` = #{to},
</if>
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')!='dm.jdbc.driver.DmDriver'">CONCAT_WS(',', BMDM, JZBMDM)
</if>
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')=='dm.jdbc.driver.DmDriver'">concat(concat(BMDM, ','), JZBMDM)
</if>
// 这里只做了DM的判断是因为mysql使用该函数无需任何参数,而DM要求OVER中必须有order by 或group by表达式的参数。
SELECT ROW_NUMBER () OVER (
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')=='dm.jdbc.driver.DmDriver'">
ORDER BY CREATIONTIME ASC
</if>
) AS RN,
<if test="@Global@getConfig('spring.datasource.db5.driver-class-name')=='com.mysql.cj.jdbc.Driver'">
AND YEAR ( CREATIONTIME ) = #{year}
AND MONTH ( CREATIONTIME ) = #{mouth}
</if>
<if test="@.Global@getConfig('spring.datasource.db5.driver-class-name')=='dm.jdbc.driver.DmDriver'">
AND TO_CHAR(CREATIONTIME,'YYYY') = #{year}
AND TO_CHAR(CREATIONTIME,'MM') = #{mouth}
</if>
文章
阅读量
获赞