自学内容网 自学内容网

jpa适配mysql切换达梦可能的坑

1、liquibase脚本

(1)达梦数据库不支持,修改字段varchar改成blob

<changeSet author="ly" id="v3.0_4_202307111505_101">
   <renameColumn tableName="PC_SS_ZRQD" oldColumnName="BHNR" newColumnName="BHNR" columnDataType="TEXT"
                 remarks="包含内容(信息项)"/>
</changeSet>

可以增加数据库判断,mysql就是text,达梦就修改成varchar(5000)

<changeSet author="ly" id="v3.0_4_202307111505_101">
   <preConditions onFail="MARK_RAN">
      <columnExists tableName="PC_SS_ZRQD" columnName="BHNR"/>
      <dbms type="mysql"/>
   </preConditions>
   <renameColumn tableName="PC_SS_ZRQD" oldColumnName="BHNR" newColumnName="BHNR" columnDataType="TEXT"
                 remarks="包含内容(信息项)"/>
</changeSet>

2、mysql的char(32)和达梦char(32)有区别

mysql如果字段定义是char(32),如果内容是1,数据表存的就是1

达梦如果字段定义是char(32),如果内容是1,数据表存的就是1加31个空格

所以对于变长的字段,达梦建议改成varchar(32)

3、group by区别

(1)下面sql达梦会报错

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId

mysql不会报错,达梦会报错

达梦的select返回值,必须在group by里面,需要改成

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh

(2)select zd ,count(1) from test

mysql不会报错,达梦会报错

达梦不支持select 字段1,字段2,count(1),不带group by的写法

4、order by区别

SELECT t1.mbbh,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh order by t1.cjsj

这个sql,mysql支持,达梦会报错。使用group by时,达梦的order by字段,必须在select中

SELECT t1.mbbh,max(t1.cjsj) as cjsj,count(1) from Sqd GROUP BY t1.mbId,t1.mbbh order by cjsj

原因:达梦执行过程

1、先执行group by,把结果生成一个临时表

2、order by是对临时表进行排序

所以,如果select 不包含排序字段会报错

5、索引唯一校验不同

达梦数据库索引名称,要全库唯一,不是表维度唯一

例如,在mysql存在数据表, zyxx,   mlxx2个表,对id都建了id_index索引,在mysql不会报错

在达梦数据库会报错

6、distinct和order by 一起使用

达梦  distinct和order by 一起使用, 如果查询结果不包含order by字段会报错

select distinct a from test order by b

mysql不报错,达梦报错。

达梦语法:select distinct a,b from test order by b

7、liquibase的text字段

text在myql库中,建表时字段类型是text, 在达梦数据库建表时是clob类型。

如果字段查询用到了in、like等,达梦的clob在jpa中不支持,会报类型错误。 mysql不会报错


原文地址:https://blog.csdn.net/s07aser123/article/details/142214092

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!