達夢數據庫適配采坑記
達夢數據庫適配采坑記
問題一
問題描述:
字段內容超長錯誤:
問題詳解:
達夢數據庫和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
解決方案:
方案一:
前端修改代碼;
方案二:
定義一個VO,把后端的返回的List
問題七:
問題描述:
達夢數據庫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
內容關於:達夢數據庫
本文屬於作者原創,未經允許,禁止轉發