文章目錄
-
- 總體介紹
- 注意事項(踩的坑)
- 函數适配(持續更新)
- 技巧
總體介紹
- 人大金倉,是國産資料管理軟體與服務提供商。主要服務于電子政務、黨務、國防軍工、金融、智慧城市、企業資訊化等行業。在北京、上海、成都、天津等地設有研發和服務中心。
- 我們公司主要做電子政務,包括政務OA和政府網站,目前很多省市的網站項目招标,都要求國産化适配,例如國産資料庫金倉、達夢等、國産伺服器東方通等。
- 本次測試使用人大金倉
版本,為人大金倉最新版,我們公司和金倉公司有直接的技術對接。V8
- 項目程式使用java語言,使用hibernate5。
注意事項(踩的坑)
- 必須針對資料庫名稱,建立使用者名,賦予權限。否則即使設定default_schema,hibernate在執行原生的sql時也會報錯“
”。例如項目資料庫名com.kingbase8.util.KSQLException: 錯誤: 關系 "cms_base_content" 不存在
,則必須使用使用者名為project_oa
連接配接。project_oa
- V8預設oracle風格,主鍵生成政策預設序列
,轉庫後需要手動添加序列SEQUENCE
。我們是由mysql轉金倉的,偏向于使用hibernate_sequence
政策。目前不支援根據配置選擇預設主鍵政策,已将問題回報給金倉開發人員,暫未提供根據配置篩選。IDENTITY
- 對現有資料庫轉庫時,轉庫程式沒有轉換視圖,視圖需要手動添加
- 字元串判空問題,我們使用的版本金倉直接把空字元串當成null,這樣在sql裡使用
判斷空就會有問題。這個可以自己修改配置,來确定字元串的空值類型。需要改一下資料庫data目錄下的a = ''
檔案;添加 參數kingbase.conf
; 重新開機資料庫 生效ora_input_emptystr_isnull=off
- 針對mysql轉金倉時,可能會将
轉為tinyint
類型,導緻程式報錯,需要在金倉庫裡,将這些布爾類型,改為tinyint。可以在mysql裡導出整個庫的結構的sql,搜尋tinyint,這樣的字段應該不多。已經将問題回報給金倉技術人員,暫未解決。boolean
- 金倉支援oracle風格的
查詢樹形結構的資料,但是hibernate執行時有警告start with connect by
,這個不影響查詢結果,可以忽略warn
- 金倉sql不支援符号“`”,可以使用引号,或者不加符号。
- 金倉SQL對于GROUP BY比MySQL要求更嚴格,字段必須出現在 GROUP BY 子句中或者在聚合函數中使用,才可以在結果裡展示
函數适配(持續更新)
- 總體來說,資料庫适配過程中,需要對代碼改動的,主要是不同的資料庫對函數的支援不同,同一個函數或同一個功能,MySQL和Oracle的都可能不一樣,此前代碼對這兩大主流資料庫做了适配。此次金倉适配,比較耗時間的代碼修改工作,也主要來自這個。
- 這個隻是目前遇到的一部分,後續如果有新的函數适配,會繼續更新
-
無法識别,但是date_format
、to_date
支援,需要使用oracle風格的寫法to_char
-
處理日期函數,在金倉裡不可以,需要使用trunc
date_trunc
-
處理日期相減的值,不支援,可以使用trunc
to_number
-
函數不支援,可以使用datediff
結合使用to_number和date_trunc
- oracle 的
需要使用ifnull
ISNULL
- oracle 的
函數,金倉不支援,可以使用CONVERT
,但是這個需要給一個參數,表示小數位數trunc
改為
CONVERT (t.count / 5090 * 100,DECIMAL ( 15, 3 ))
trunc(t.count / 5090 * 100, 3)
技巧
- 對于金倉資料庫支援的函數問題,或者SQL文法問題,可以在金倉資料庫管理工具裡的幫助文檔裡檢視
-
-幫助(H)
,點選菜單即可檢視文檔。此文檔是管理工具自帶的,是金倉提供給開發人員或資料庫管理者的幫助文檔,你可以按照需要浏覽或搜尋,很多疑問都可以在此處得到解答。幫助文檔
- 例如,針對
函數适用性,可以搜尋文檔,得到結果,發現不支援。可以繼續搜尋“日期格式”等關鍵詞,去查找結果。對于得到的多條結果,可以點選左側導航選擇,再使用date_format
二次搜尋文字位置,進行檢視。CTRL + F
國産資料庫人大金倉踩坑記錄和函數适配 國産資料庫人大金倉踩坑記錄和函數适配