達夢數據庫適配采坑記

問題一

問題描述:

字段內容超長錯誤:

問題詳解:

達夢數據庫和Oracle同樣,對字段的長度有嚴格的規范,當然Mysql也是有的,但是默認是不啟用的,哪怕超出了,也會自動擴容,但是Oracle和達夢是不會的;

解決方案:

方案一:

對數據庫的字段長度進行變更;

方案二:

變更數據類型;

方案三:

約束字段長度,或者進行截取處理

問題二:

問題描述:

語句分析錯誤,不識別[`]符號

問題詳解:

在Mysql中[`]符號是為了防止和Mysql的系統字段沖突,標識這個一個普通字段,但是在達夢數據庫中,不識別這個符號;

解決方案:

方案一:

采用MyBatis的攔截器對SQL進行攔截處理;

方案二:

對XML中的SQL里面的[`]符號進行刪除替換(推薦);

問題三:

問題描述:

不是GROUP by 表達式

問題詳解:

因為在Oracle和達夢中查詢字段必須在分組中出現,所以報錯

解決方案:

方案一:

修改代碼,去掉Sql中查詢的不是分組的字段,通過代碼二次查詢實現;

問題四:

問題描述:

問題詳解:

解決方案:

方案一:

案例:

問題五:

問題描述:

on duplicate key update語法分析錯誤

問題詳解:

屬於Mysql專用語法,在Oracle和達夢中是不支持的

解決方案:

方案一:

使用Merge修改(不推薦)

案例:

修改前:
insert into sys_logininfo(info_id,infp_name) values(1,2) on duplicate key update info_id=2,infp_name=’aaa’;
修改后:
merge into sys_logininfo t1 using(
select 1 info_id,2 infp_name from dual
) t2 on
(t1.info_id=t2.info_id)
WHEN MATCHED THEN
update set info_id=2,infp_name=’aaa’ WHEN NOT MATCHED THEN INSERT VALUES (1,2);

使用詳解:

https://blog.csdn.net/jackpk/article/details/50336941

遺留問題:

在使用druid連接池時,報了一個錯,但是並不影響

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' MERGE INTO sys_logininfo t1 US', expect MERGE, actual IDENTIFIER pos 82, line 1, column 1, token IDENTIFIER MERGE

方案二:

通過代碼拆分insertOrUpdate 拆分為insert和update

問題六:

問題面熟:

前端展示空白,后端沒有報錯

樣例:

問題詳解:

因為Mysql遷移到了達夢,所以字段全部由小寫轉換為大寫,本身返回Bean是沒有問題的,但是一些特殊的SQL返回的是List所以結果Key全部為大寫,所以前端調用時為小寫,所以無法展示;

解決方案:

方案一:

前端修改代碼;

方案二:

定義一個VO,把后端的返回的List,轉成定義的VO,返回前端;

問題七:

問題描述:

達夢數據庫concat函數不認識[“]符號

問題詳解:

在Mysql中無論是[‘][“]都是識別的,但是在達夢中只識別[‘];

解決方案:

方案一:

用[‘]替換項目中的[“];

樣例:

修改前:
select * from aa where a like CONCAT(“%”,”龍”,”%”);
修改后:
select * from aa where a like CONCAT(‘%’,’龍’,’%’);

問題八:

問題描述:

達夢數據庫查詢列別名時使用[‘’]包裹,是會報錯的

問題詳解:

達夢數據庫在做關鍵字區分時采用[“”]包裹

解決方案:

方案一:

采用[“”]替換[‘’]

樣例:

不帶關鍵字
修改前:
select aa as ‘a’ from aaa;
修改后
select aa as a from aaa;
帶關鍵字
修改前:
select aa as ‘index’ from aaa;
修改后:
select aa as “index” from aaa;

問題九:

問題描述:

使用concat直接包裹字段,會報錯,無法解析的表達式

問題詳解:

達夢不支持無條件的拼接

解決方案:

方案一:

去掉concat

樣例:

修改前:
select concat(aaa) as a from aa;
修改后:
select aaa as a from aa;

 

作者:彼岸舞

時間:2020\06\23

內容關於:達夢數據庫

本文屬於作者原創,未經允許,禁止轉發