GBase 8c
适配迁移
文章

南大通用GBase 8c数据库之mysql迁移适配常见误区

发表于2026-08-07 13:56:50310次浏览0个评论

一、基础配置

1. 驱动配置

在外部连接GBase 8c数据库时,需要配置驱动:

驱动类路径:cn.gbase.Driver
JDBC连接地址:jdbc:gbase://${ip}:${port}/${dbName}

若使用本地Maven引用,可将驱动拷贝至工程lib目录下,并在pom.xml中添加如下依赖:

xml
<dependency>
   <groupId>cn.gbase</groupId>
   <artifactId>gbase-jdbc</artifactId>
   <version>5.0.0B03</version>
   <scope>system</scope>
   <systemPath>${project.basedir}/lib/gbase-jdbc-5.0.0B03.jar</systemPath>
</dependency>

2. JDBC 参数推荐

参数名建议值说明
stringtypeunspecified避免参数类型推断失败
blobModeoff将 Blob 类型映射为 bytea 类型
batchModetrue支持批量插入操作
resultColumnHandleuppercase返回大写字段名(需专用JDBC包)


二、SQL 语法兼容性问题

1. 保留关键字问题

问题:表名或字段名为数据库保留关键字,导致SQL执行报错。

解决方案(按优先级排序):

1.优先修改表名或字段名,规避保留关键字;
2.使用双引号转义关键字字段/表名;
3.配置8c数据库参数豁免保留关键字校验。

参数配置命令:

su - gbase
gs_guc reload -N all -I all -Z datanode -c “exclude_reserved_words='ignore,now'”

注意:部分关键字(如to、user)仍可能触发语法错误,配置后建议提前测试各类SQL语句兼容性。

2. 引号混用问题

问题:SQL语句中同时混用单引号、双引号,触发语法解析异常。
错误示例:

select * from test where id="1" and age='2';

解决方案:统一使用单引号包裹字符串值。
正确示例:

select * from test where id='1' and age='2';

3. GROUP BY 字段不在 SELECT 列表中报错

问题:MySQL支持GROUP BY字段不在SELECT查询列表中,GBase默认开启严格模式,直接报错。
解决方案:修改数据库sql_mode,移除sql_mode_full_group严格校验规则。

alter database <数据库名> set dolphin.sql_mode='sql_mode_strict,pipes_as_concat,ansi_quotes,no_zero_date,pad_char_to_full_length,auto_recompile_function,error_for_division_by_zero';

4. UNION 排序问题

解决方案:开启子查询UNION排序支持参数。

set enable_union_all_subquery_orderby=on;

三、数据类型与编码问题

字段编码不一致排查与修改

1.查询表字段编码详情

SELECT 
   table_name,
   column_name,
   data_type,
   character_set_name,
   collation_name,
   is_nullable
FROM information_schema.columns 
WHERE table_name IN ('表1', '表2', '表3', '表4');

2.修改字段编码格式

ALTER TABLE reward_declare_task_histc 
ALTER COLUMN 字段名 TYPE VARCHAR(128) COLLATE "C";

四、大小写与返回格式问题

1. 查询字段统一返回大写

JDBC 参数配置:

resultColumnHandle=uppercase

备注:必须配套专用 GBase JDBC 驱动包

2. 表名大小写敏感控制

数据库级参数配置,修改后重新连接库生效:

alter database <数据库名> set dolphin.lower_case_table_names to 0;

3. 数据内容查询不区分大小写

表级排序规则设置为 utf8_general_ci

五、性能优化

1. JOIN 中 OR 条件拖慢查询

优化方案:用UNION ALL拆分替换 OR 多条件关联

2. 批量插入报错 / 失效

JDBC 开启批量模式:

batchMode=true

六、加密函数兼容替换

AES_ENCRYPT / AES_DECRYPT 替换

GBase 内置 AES128 加密解密函数:

加密:gs_encrypt_aes128(数据, 密钥)

解密:gs_decrypt_aes128(数据, 密钥)

密钥规范:长度 8~16 字节;必须包含大写、小写、数字、特殊符号中至少 3 类

使用示例:

gs_encrypt_aes128('数据', 'Ivory@pmTool')

迁移注意:MySQL 原有密文需先用 AES_DECRYPT 解密明文,再用 gs_encrypt_aes128 重新加密入库

七、错误日志与调试排错

现象:数据库客户端执行 SQL 无报错,程序代码调用报错
调高服务端日志提示级别:

运行

gs_guc set -N all -I all -c "client_min_messages=notice"
gs_guc set -N all -I all -c “log_min_messages=warning”

排查方式:先在 GBase 服务端手动执行 SQL,查看 Notice、Warning 详细告警信息

八、层级递归查询兼容

MySQL 依赖 @会话变量实现树形层级查询
GBase 统一使用标准 SQL 递归 CTE 语法:
WITH RECURSIVE …

九、多表联查 GROUP BY 规范

问题:多表 JOIN 后 GROUP BY 只写字段名、不指定表别名,语法校验失败

规范写法:分组字段必须携带表别名

示例:

SELECT a.id, b.name 
FROM table_a a 
JOIN table_b b ON a.id = b.id 
GROUP BY a.id;

评论

登录后才可以发表评论