# Kingbase 只读兼容性核验 ## 1. 核验边界与方法 本报告针对当前项目实际连接的 Kingbase 实例执行只读探测。连接复用现有数据源配置,通过项目已有 Kingbase JDBC 驱动建立;事务设置为只读,全部业务探测均使用 `SELECT`、`SHOW` 或系统目录查询,结束时执行回滚并关闭连接。未执行任何 DDL、DML、迁移或生成键写入测试,也未在报告中记录连接密码。 当前环境证据: | 项目 | 实际结果 | | --- | --- | | 数据库产品 | KingbaseES V009R003C018 | | JDBC 驱动 | Kingbase8 JDBC Driver V008R006B0001;Maven 依赖版本 8.6.0 | | database | `training` | | schema | `public` | | `database_mode` | `mysql` | | 服务端兼容基线 | `server_version` 返回 12.1 | | 简单 SELECT | 正常 | ## 2. 指定语法的实测结果 | 探测项 | 无副作用测试形式 | 实际结果 | 分类 | 对当前代码的含义 | | --- | --- | --- | --- | --- | | `date_format` | 对固定 timestamp 格式化为 `%Y%m%d` | 返回 `20260102` | 兼容模式支持 | 若依 Mapper 中同类写法可被当前实例解析 | | `ifnull` | `ifnull(null,'fallback')` | 返回 `fallback` | 兼容模式支持 | 当前 Mapper 中的空值表达式可被解析 | | `find_in_set` | `find_in_set('2','1,2,3')` | 返回 2 | 兼容模式支持 | 若依数据权限中同类表达式具备语法基础 | | `current_database()` | 查询当前数据库 | 返回 `training` | 当前实例直接支持 | 函数本身可用,但不能代替当前 schema,见第4节 | | `sysdate()` | 查询当前时间 | 返回 timestamp | 兼容模式支持 | MySQL 风格当前时间函数可用 | | `LIMIT 1 OFFSET 1` | 常规分页 SELECT | 正常返回 | 当前实例直接支持 | PostgreSQL/Kingbase 风格分页可用 | | `LIMIT 0,1` | MySQL 风格分页 SELECT | 正常返回 | 兼容模式支持 | 当前 `PageHelper helperDialect=mysql` 具备语法基础 | | `SELECT 1 FROM dual` | 数据源校验形式 | 返回 1 | 兼容模式支持 | 当前 Druid validation query 可用 | | 反引号标识符 | 使用反引号访问 `public.sys_menu` 字段 | 正常返回 | 兼容模式支持 | 代码生成器中的反引号可被当前实例解析 | 本次明确列出的 MySQL 语法探测均通过。结论只适用于当前 `database_mode=mysql` 实例,不能据此推断其他 Kingbase 实例或其他兼容模式也会通过。 ## 3. PageHelper 分页判断 配置依据: - `ruoyi-admin/src/main/resources/application.yml` 中 PageHelper 使用 `helperDialect: mysql`。 - 当前实例能够执行 `LIMIT offset,row_count`,所以 PageHelper 常见的 MySQL 分页尾句在语法层面可用。 只读测试没有启动完整 Web 请求链,也没有核对每一种复杂 Mapper SQL 经 PageHelper 改写后的结果。当前可判定为“分页基础语法兼容”,完整插件行为仍需后续集成测试。 ## 4. 已确认的应用级兼容冲突 ### 4.1 代码生成器把 database 当作 schema 当前代码生成器在信息模式查询中使用: ```sql table_schema = current_database() ``` 当前 `current_database()` 是 `training`,实际业务表 schema 是 `public`。只读核验结果: - 按当前生成器条件查询:0 张表; - `public` schema 实际有 46 张表; - `public.train_teacher` 实际有 12个字段,按当前生成器条件查询为0个字段。 因此这不是 SQL 函数不支持,而是 database 与 schema 语义被混用。当前代码生成模块无法依靠这组查询正确发现实际表结构,数据库 V2 前必须明确处理。 相关文件: - `ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml` - `ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml` ### 4.2 `sys_*` 名称与 Kingbase 系统视图冲突 当前隐式 schema 搜索顺序为: ```text sys, pg_catalog, sys_catalog, public ``` `sys_catalog` 中存在 `sys_user`、`sys_role`、`sys_config` 系统视图,`public` 中同时存在若依同名业务表。当前若依 Mapper 普遍使用未限定 schema 的表名。只读探测显示: - 未限定的 `sys_user.user_id` 查询失败,命中了系统视图; - 未限定的 `sys_role.role_id` 查询失败,命中了系统视图; - 未限定的 `sys_config.config_id` 查询失败,命中了系统视图; - 显式访问 `public.sys_user`、`public.sys_role`、`public.sys_config` 时结构可正常读取。 因此若依登录、角色和配置等核心 Mapper 当前具备真实运行阻塞。该问题不能由“数据库支持 MySQL 函数”这一结论覆盖。 相关文件: - `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml` - `ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml` - `ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml` ## 5. generated keys 与 identity/sequence 当前6张数字主键业务表的主键实际为 `bigint GENERATED BY DEFAULT AS IDENTITY`,数据库目录能够识别对应内部 sequence。JDBC 元数据结果: - `IS_AUTOINCREMENT=YES`; - 驱动声明 `supportsGetGeneratedKeys=true`。 这说明 MyBatis `useGeneratedKeys` 具备数据库和驱动基础条件。由于实际插入会修改数据,本阶段没有执行 INSERT,也不能确认所有 Mapper 的生成键回填行为。该项分类为“基础条件满足,完整行为无法只读确认”。 ## 6. 分类结论 ### 当前实例直接支持 - `current_database()`; - `LIMIT ... OFFSET ...`; - 标准只读事务与系统目录查询; - identity/sequence 元数据读取。 ### 兼容模式支持 - `date_format`; - `ifnull`; - `find_in_set`; - `sysdate()`; - MySQL 风格 `LIMIT offset,row_count`; - `DUAL`; - 反引号标识符。 ### 明确不支持 本次指定且可安全执行的语法项中,没有发现当前实例明确不支持的项。 ### 无法只读确认 - MyBatis 在真实 INSERT 场景中的 generated keys 回填; - PageHelper 对全部复杂 Mapper SQL 的改写和计数行为; - 触发器、批量写入、导入导出等写链路的完整兼容性。 ### 已确认但不属于语法缺失的问题 - 代码生成器以 `current_database()` 过滤 `table_schema`,当前返回空结果; - 未限定 schema 的若依 `sys_*` Mapper 命中 Kingbase 系统视图,核心账号与权限查询会失败。 ## 7. Phase 0判断 当前 Kingbase MySQL 兼容模式覆盖了项目已识别的主要 MySQL 函数和分页形式,但项目不能据此视为“已完成 Kingbase 适配”。数据库 V2 前应先确定 schema 解析策略、系统表访问策略和生成键集成验证方案;本报告只记录现状,不提出或实施源码、配置、数据库结构修复。