原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
在数据库迁移或应用适配过程中,从 MySQL 迁移到 GBase 8c 会遇到一系列兼容性问题。本文将汇总常见的 MySQL 适配 GBase 8c 问题及其解决方案,帮助开发人员顺利完成迁移工作。
一、基础配置问题
1.JDBC 驱动配置
MySQL 常用配置:
XML
GBase 适配配置:
XML
驱动类配置:
properties
driver-class: cn.gbase.Driver
jdbUrl: jdbc:gbase://${ip}:${port}/${dbName}
二、SQL 语法兼容性问题
2.关键字冲突问题
问题描述:表名或字段名使用了数据库保留关键字导致冲突。
解决方案:
- 首选方案: 修改字段或表名称,避免使用关键字;
- 次选方案: 使用双引号转义关键字,如 select "user" from table;
- 最后方案: 配置参数忽略指定关键字。
# 配置 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.参数类型推断问题
问题描述:参数类型无法推断导致报错。
解决方案:
- 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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。