南大通用GBase 8c数据库之mysql迁移适配常见误区
一、基础配置
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 参数推荐
| 参数名 | 建议值 | 说明 |
| stringtype | unspecified | 避免参数类型推断失败 |
| blobMode | off | 将 Blob 类型映射为 bytea 类型 |
| batchMode | true | 支持批量插入操作 |
| resultColumnHandle | uppercase | 返回大写字段名(需专用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;
评论
热门帖子
- 12025-12-01浏览数:183702
- 22023-05-09浏览数:26405
- 42023-09-25浏览数:20070
- 52020-05-11浏览数:18798