GBase 8s 的 “一库三模”:同一引擎,三类语法体系

发布时间:2026-08-21

从 Oracle 迁移,NUMBER 类型不认识,PL/SQL 包直接报错?

从 MySQL 迁移,SHOW跑不通,AUTO_INCREMENT 不支持?

数据库迁移最头疼的从来不是导数据,而是改 SQL。

GBase 8s 的解法很直接:不用改,切个模式就行。

一、什么是"一库三模"

GBase 8s 在同一套数据库引擎之上,内置了三种 SQL 兼容模式:

三种模式并非三套数据库,而是同一套实例的三种语法面孔。不同应用通过不同模式接入,即可使用各自熟悉的 SQL 。

二、兼容到什么程度

  • Oracle 兼容

基础功能

常用数据类型(NUMBER、VARCHAR2、CLOB、DATE 、BFILE等)、常用函数及基础数据库对象(堆表、分区表、临时表、视图、物化视图、索引、触发器、序列、同义词、定时任务、系统视图等)。

高级功能

  • PL/SQL 支持:变量类型(%TYPE、%ROWTYPE、记录类型、数组类型、嵌套表、条件与控制语句、游标、包(Package)、动态SQL、自治事务、异常处理等)

  • 高级系统包:兼容DBMS_JOB  、UTL_ENCODE 、UTL_RAW  、DBMS_SCHEDULER、DBMS_RANDOM 等多种高级系统包

  • DBLINK:支持异构数据库访问

  • FLASHBACK:支持闪回查询

  • 集群能力: 共享存储集群SSC,可对标 RAC/ADG

接口与工具

  • 兼容JDBC、ODBC、.NET、Python、Go 等业界标准接口

  • 兼容Oracle OCI、OCCI接口

  • 提供全量迁移与实时增量同步工具

MySQL 兼容

基础功能

常用数据类型(TINYINT、VARBINARY、UNSIGNED、BIT、DATE、DECIMAL等)、常用函数、AUTO_INCREMENT 自增主键、DELIMITER 存储过程分隔符,反引号包围符、视图等。

高级功能

  • ROUTINE:变量声明与赋值、REPEAT、LEAVE、WHILE等控制语句、LABEL标签、游标、触发器、PREPARE动态语句、HANDLER、CONDITION及SIGNAL等异常处理

  • 独特语法:LIMIT子句、REPLACE INTO、INSERT IGNORE、INSERT ... ON DUPLICATE KEY UPDATE、INSERT INTO ... SET、SHOW TABLES/DATABASES等系列查看命令

  • 变量:用户自定义变量

接口与工具

  • 兼容JDBC、ODBC、.NET、Python、Go 等业界标准接口

  • GCI接口全兼容 MySQL C API 头文件,C/C++ 开发者无需修改代码

  • 提供全量迁移与实时增量同步工具

三、客户端怎么切换模式

dbaccess 命令行客户端

方式一:SQL 语句切换(会话级)

进入 dbaccess 后,执行以下SQL语句即可切换当前会话的兼容模式,该方式仅影响当前会话,适合临时验证、SQL 兼容性测试等场景。

方式二:环境变量切换(全局)

在启动 dbaccess 前,通过环境变量指定默认模式,客户端启动后即进入对应兼容模式,无需每次手动执行 set environment 命令。

应用连接(以 JDBC 为例)

在应用层,通过 JDBC 连接串中的参数 sqlmode 指定兼容模式,应用层即可实现"无痛迁移"。

URL 示例:

四、三个常见误区

误区一:模式切换全局生效

set environment sqlmode 仅作用于当前会话。如需全局生效,必须在应用连接串统一指定。

误区二:三种模式可以混用

同一应用内部应固定一种模式。gbase模式下建的存储过程,在 oracle 模式下执行有报错的可能性。不同应用可以连不同模式,但同一应用不要来回切换。

误区三:切了模式就实现零改动

兼容模式覆盖了绝大多数日常开发场景,但不代表源数据库的每一个特性、每一个系统包、每一种特殊写法都能原封不动搬过来。正式迁移前建议先用核心业务流程做一轮兼容性验证,做到心中有数。