南大通用GBase 8c MySQL适配问题汇总

0 阅读4分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在数据库迁移或应用适配过程中,从 MySQL 迁移到 GBase 8c 会遇到一系列兼容性问题。本文将汇总常见的 MySQL 适配 GBase 8c 问题及其解决方案,帮助开发人员顺利完成迁移工作。

一、基础配置问题

1.JDBC 驱动配置

MySQL 常用配置:

XML
image.png

GBase 适配配置:
XML
image.png

驱动类配置:
properties

driver-class: cn.gbase.Driver

jdbUrl: jdbc:gbase://${ip}:${port}/${dbName}
​

二、SQL 语法兼容性问题

2.关键字冲突问题

问题描述:表名或字段名使用了数据库保留关键字导致冲突。
解决方案:

  1. 首选方案: 修改字段或表名称,避免使用关键字;
  2. 次选方案: 使用双引号转义关键字,如 select "user" from table;
  3. 最后方案: 配置参数忽略指定关键字。
# 配置 exclude_reserved_words 参数

su - gbase

gs_guc reload -N all -I all -Z datanode -c "exclude_reserved_words='ignore,now'"

3.引号使用不一致问题

MySQL 写法:

select * from test where id="1" and age='2'  -- 混合使用单双引号

GBase 写法:

select * from test where id='1' and age='2'  -- 统一使用单引号

4.GROUP BY 字段规范问题

MySQL 写法(宽松模式):

select name, age from user group by name  -- age 不在 group by 中
​

GBase 严格模式要求:

-- 需要指定具体表的字段

select user.name, user.age from user 

join dept on user.dept_id = dept.id 

group by user.name

-- 或修改 sql_mode 参数

alter database dbname 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';
​

三、数据类型兼容问题

5.参数类型推断问题

问题描述:参数类型无法推断导致报错。
解决方案:

  1. JDBC 参数配置
    properties
stringtype=unspecified
​

2. SQL 中强制类型转换

-- 使用::操作符进行类型转换

select * from table where id = ?::varchar

6.BLOB/LONGBLOB 类型处理

MySQL 使用:

create table test (content blob);
​

GBase 使用:

-- 创建隐式转换

create cast(blob as bytea) with inout as IMPLICIT;

-- JDBC 参数配置

blobMode=on  # on 表示 blob 类型,off 表示 bytea 类型
​

7.时间格式问题

问题描述:0000-00-00 无法插入。
解决方案:修改 sql_mode 参数。

alter database dbname set dolphin.sql_mode='sql_mode_strict,pipes_as_concat,ansi_quotes,pad_char_to_full_length,auto_recompile_function,error_for_division_by_zero';

8.TIME 类型迁移

-- MySQL的time类型

time datetime
​
-- GBase 适配

time timestamp(0) without time zone
​

四、函数兼容性问题

9.加密解密函数

MySQL:

SELECT AES_DECRYPT(field, 'key') FROM table;

SELECT AES_ENCRYPT('data', 'key') FROM table;
​

GBase:

-- 使用 gs_decrypt_aes128 和 gs_encrypt_aes128 替代

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

SELECT gs_decrypt_aes128(encrypt_field, 'Ivory@pmTool');
​

注意:GBase 密钥要求 8-16 字节,至少包含 3 种字符(大写字母、小写字母、数字、特殊字符)

10.会话变量替代

MySQL 写法:

-- 使用@变量
SELECT @r := 1;
​

GBase 标准 SQL 写法:

-- 使用 WITH RECURSIVE 替代

WITH RECURSIVE cte AS (

    SELECT 1 as r

    UNION ALL

    SELECT r+1 FROM cte WHERE r < 10

)

SELECT * FROM cte;

-- 或使用标准赋值语法

SET var = 1;
​

五、性能优化问题

11.OR 条件性能问题

问题描述:OR 条件在 JOIN 中影响性能。
优化方案:使用 UNION ALL 替代。

-- 低效写法
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id 
WHERE t1.status = 1 OR t2.status = 1

-- 优化写法
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id WHERE t1.status = 1
UNION ALL
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id WHERE t2.status = 1

12.UNION 排序问题

配置参数:

set enable_union_all_subquery_orderby=on;

六、字符集与大小写问题

13.表名大小写敏感

配置数据库级别参数:

-- lower_case_table_names=1(默认) 大小写不敏感
-- lower_case_table_names=0 支持大写
alter database 数据库名 set dolphin.lower_case_table_names to 0;

14.数据大小写敏感

使用 utf8_general_ci 编码实现大小写不敏感:

-- 查询时不区分大小写
ALTER TABLE table_name ALTER COLUMN column_name TYPE VARCHAR(128) COLLATE "C";
​

15.字段编码格式不一致

查询字段编码信息:

SELECT 
    table_name,
    column_name,
    data_type,
    character_set_name,
    collation_name
FROM information_schema.columns 
WHERE table_name IN ('table1', 'table2');
​

修改字段编码:

ALTER TABLE table_name ALTER COLUMN column_name TYPE VARCHAR(128) COLLATE "C";
​

七、其他常见问题

16.HAVING 子句问题

MySQL 写法:

SELECT id, COUNT(*) FROM table 
GROUP BY id 
HAVING COUNT(*) > 1, status = 1  -- 逗号分隔

GBase 写法:

SELECT id, COUNT(*) FROM table 
GROUP BY id 
HAVING COUNT(*) > 1 AND status = 1  -- 使用AND连接

17.批量插入问题

JDBC 参数配置:
properties

batchMode=true

18.字段返回大写需求

JDBC 参数配置:
properties

resultColumnHandle=uppercase
​

注意:需要使用特殊的 JDBC 包。

19.客户端与代码执行不一致

问题描述:服务器执行正常,代码执行报错。
调整日志级别:

gs_guc set -N all -I all -c "client_min_messages=notice"

gs_guc set -N all -I all -c "log_min_messages=warning"

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。