近日,公司的某軟件產品——原本使用 PostgreSQL 數據庫——需要支持人大金倉 (Kingbase) 數據庫。據了解,Kingbase 是基於 開源數據庫 PostgreSQL 開發的,大部分功能與 PostgreSQL兼容。Kingbase 8 是基於 PostgreSQL 9.6 的。本文列舉發現的 PostgreSQL 9.6 與 Kingbase 8 的差異對比。
1 JDBC
|
|
postgresql 9.6 |
kingbase 8 |
| driver_class |
org.postgresql.Driver |
com.kingbase8.Driver |
| url |
jdbc:postgresql://127.0.0.1:5432/postgres |
jdbc:kingbase8://127.0.0.1:54321/kingbase |
| jdbc 的 jar |
postgresql.jdbc-9.0.jar
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql.jdbc</artifactId> <version>9.0</version> </dependency> |
kingbase8-8.2.0.jar <groupId>com.kingbase8</groupId> <artifactId>kingbase8-jdbc</artifactId> <version>8.2.0</version> </dependency> |
| hibernate 的jar |
hibernate-5.0.12.jar <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>5.0.12</version> </dependency> |
hibernate-3.6.0-dialect-1.0.jar <dependency> <groupId>com.kingbase</groupId> <artifactId>hibernate-3.6.0-dialect</artifactId> <version>1.0</version> </dependency> |
| hibernate方言 |
org.hibernate.dialect.PostgreSQL9Dialect |
org.hibernate.dialect.Kingbase8Dialect |
這里127.0.0.1 表示本地的ip地址。
5432 是postgresql的默認端口;54321則是達夢的默認端口。
postgres 是postgresql默認的數據庫名,kingbase是Kingbase默認的數據庫名。
這些參數可根據實際調整。
2 命令程序
| postgresql 9.6 |
kingbase 8 |
| pgbench |
kbbench |
| postgres |
kingbase |
| psql |
ksql |
| pg_archivecleanup |
sys_archivecleanup |
| pg_basebackup |
sys_basebackup |
| pg_bulkload |
sys_bulkload |
| pg_config |
sys_config |
| pg_controldata |
sys_controldata |
| pg_ctl |
sys_ctl |
| pg_dump |
sys_dump |
| pg_dumpall |
sys_dumpall |
| pg_hm |
sys_hm |
| pg_isready |
sys_isready |
| pglogical_create_subscriber |
syslogical_create_subscriber |
| pg_receivexlog |
sys_receivexlog |
| pg_recvlogical |
sys_recvlogical |
| pg_resetxlog |
sys_resetxlog |
| pg_restore |
sys_restore |
| pg_rewind |
sys_rewind |
| pg_rman |
sys_rman |
| pg_test_fsync |
sys_test_fsync |
| pg_test_timing |
sys_test_timing |
| pg_upgrade |
sys_upgrade |
| pg_xlogdump |
sys_xlogdump |
可以看到,這里kingbase只是將postgresql 的表的前綴從 pg 改成了 sys 或者 kb。
3 系統表和視圖
| postgresql 9.6 |
kingbase 8 |
| pg_aggregate |
sys_aggregate |
| pg_am |
sys_am |
| pg_amop |
sys_amop |
| pg_amproc |
sys_amproc |
| pg_attrdef |
sys_attrdef |
| pg_attribute |
sys_attribute |
| pg_authid |
sys_authid |
| pg_auth_members |
sys_auth_members |
| pg_cast |
sys_cast |
| pg_class |
sys_class |
| pg_collation |
sys_collation |
| pg_constraint |
sys_constraint |
| pg_conversion |
sys_conversion |
| pg_database |
sys_database |
| pg_db_role_setting |
sys_db_role_setting |
| pg_default_acl |
sys_default_acl |
| pg_depend |
sys_depend |
| pg_description |
sys_description |
| pg_enum |
sys_enum |
| pg_event_trigger |
sys_event_trigger |
| pg_extension |
sys_extension |
| pg_foreign_data_wrapper |
sys_foreign_data_wrapper |
| pg_foreign_server |
sys_foreign_server |
| pg_foreign_table |
sys_foreign_table |
| pg_index |
sys_index |
| pg_inherits |
sys_inherits |
| pg_init_privs |
sys_init_privs |
| pg_language |
sys_language |
| pg_largeobject |
sys_largeobject |
| pg_largeobject_metadata |
sys_largeobject_metadata |
| pg_namespace |
sys_namespace |
| pg_opclass |
sys_opclass |
| pg_operator |
sys_operator |
| pg_opfamily |
sys_opfamily |
| pg_partitioned_table |
sys_partitioned_table |
| pg_pltemplate |
sys_pltemplate |
| pg_policy |
sys_policy |
| pg_proc |
sys_proc |
| pg_publication |
sys_publication |
| pg_publication_rel |
sys_publication_rel |
| pg_range |
sys_range |
| pg_replication_origin |
sys_replication_origin |
| pg_rewrite |
sys_rewrite |
| pg_seclabel |
sys_seclabel |
| pg_sequence |
sys_sequence |
| pg_shdepend |
sys_shdepend |
| pg_shdescription |
sys_shdescription |
| pg_shseclabel |
sys_shseclabel |
| pg_statistic |
sys_statistic |
| pg_statistic_ext |
sys_statistic_ext |
| pg_subscription |
sys_subscription |
| pg_subscription_rel |
sys_subscription_rel |
| pg_tablespace |
sys_tablespace |
| pg_transform |
sys_transform |
| pg_trigger |
sys_trigger |
| pg_ts_config |
sys_ts_config |
| pg_ts_config_map |
sys_ts_config_map |
| pg_ts_dict |
sys_ts_dict |
| pg_ts_parser |
sys_ts_parser |
| pg_ts_template |
sys_ts_template |
| pg_type |
sys_type |
| pg_user_mapping |
sys_user_mapping |
| System Views |
sysstem Views |
| pg_available_extensions |
sys_available_extensions |
| pg_available_extension_versions |
sys_available_extension_versions |
| pg_config |
sys_config |
| pg_cursors |
sys_cursors |
| pg_file_settings |
sys_file_settings |
| pg_group |
sys_group |
| pg_hba_file_rules |
sys_hba_file_rules |
| pg_indexes |
sys_indexes |
| pg_locks |
sys_locks |
| pg_matviews |
sys_matviews |
| pg_policies |
sys_policies |
| pg_prepared_statements |
sys_prepared_statements |
| pg_prepared_xacts |
sys_prepared_xacts |
| pg_publication_tables |
sys_publication_tables |
| pg_replication_origin_status |
sys_replication_origin_status |
| pg_replication_slots |
sys_replication_slots |
| pg_roles |
sys_roles |
| pg_rules |
sys_rules |
| pg_seclabels |
sys_seclabels |
| pg_sequences |
sys_sequences |
| pg_settings |
sys_settings |
| pg_shadow |
sys_shadow |
| pg_stats |
sys_stats |
| pg_tables |
sys_tables |
| pg_timezone_abbrevs |
sys_timezone_abbrevs |
| pg_timezone_names |
sys_timezone_names |
| pg_user |
sys_user |
| pg_user_mappings |
sys_user_mappings |
| pg_views |
sys_views |
可以看到,這里 kingbase只是將postgresql 的表的前綴從 pg 改成了 sys
4 創建函數的語法
| 差異項/數據庫 |
postgresql 9.6 |
kingbase 8 |
| 函數定義 |
create or replace function f(a int) |
create or replace internal function f(a int) |
| 函數中聲明變量 |
create or replace function f(a int) |
create or replace internal function f(a int) |
5 其他要注意的事項
如果需要程序保持對postgresql的兼容性,需要在kingbase 的配置文件kingbase.conf 中修改或新增下面幾個參數:
char_default_type = 'char'
ora_func_style = false
ora_numop_style = false
ora_input_emptystr_isnull = false
ora_plsql_style = false
ora_date_style = 'off'
ora_format_style = 'off'
下面是這幾個參數的含義。
| 參數 |
含義 |
| char_default_type |
VARCHAR 類型的長度單位。
char 表示以字符位單位,byte表示以字節為單位。 |
| ora_func_style |
設置兼容Oracle函數行為,默認為true啟用狀態。當設置true時, sequence.nextval兼容Oracle的Sequence偽列行為。 比如,SELECT SEQ.NEXTVAL AS A, SEQ.NEXTVAL AS B FROM DUAL,結果A B 值相同。 ltrim/rtrim/btrim兼容Oracle對應函數行為,最長的只包含characters只能是 一個字符。 textcat兼容Oracle字符串連接NULL時候,結果為字符串本身。 regexp_replace兼容Oracle該函數行為,regexp_replace參數中有NULL出現,當做 空串處理。 當關閉(false)ora_func_style時,上述函數表現為原有形式。 |
| ora_numop_style |
是否兼容oracle 數學運算符的用法。默認為true。 |
| ora_input_emptystr_isnull |
設置空串輸入的輸入形式(空串或NULL)及部分函數返回值空串輸出形式(空串或NULL),默認為true啟用狀態。當啟用(true)ora_input_emptystr_isnull時, 若輸入空串,則空串將變成NULL的形式輸入。 |
| ora_plsql_style |
是否是oracle的plsql風格。默認是true。 |
| ora_date_style |
是否是oracle的日期風格。默認是true。 |
| ora_format_style |
是否是oracle的格式風格。默認是true。 |
