好的!以下是《KingbaseES 中的 MySQL 案例实战》的详细技术解析,适合具备 MySQL 基础的开发者,希望快速迁移到 KingbaseES 环境或进行兼容性测试与实战操作的人员使用。


📘 KingbaseES 中的 MySQL 案例实战指南


📚 目录

  1. KingbaseES 简介与 MySQL 兼容模式概述
  2. 开启 KingbaseES 的 MySQL 模式
  3. 常见 MySQL 语法兼容测试
  4. 案例实战:建表、插入、查询、更新、事务控制
  5. 案例实战:函数与存储过程迁移
  6. 案例实战:MySQL 数据导入到 KingbaseES
  7. 工具推荐与兼容性调优技巧
  8. 常见问题排查与解决方案
  9. 总结与迁移建议

🧠 1. KingbaseES 简介与 MySQL 模式说明

KingbaseES 是国产自研的高性能关系型数据库,兼容 PostgreSQL 语法核心,同时提供 MySQL 模拟兼容层,便于用户平滑迁移。

✅ MySQL 模式用途:

  • 兼容 MySQL 数据类型、函数名、语法风格
  • 便于第三方 MySQL 工具接入(如 Navicat、DBeaver)
  • 支持部分存储过程迁移场景

⚙️ 2. 开启 KingbaseES 的 MySQL 模式

进入 SQL 界面后:

SET client_encoding = 'UTF8';
SET datestyle = 'ISO, YMD';
SET kingbase_compatible_mode = 'MYSQL';  -- 启用 MySQL 兼容语法

📌 注意:建议在登录时自动配置,或配置在 postgresql.conf


🧾 3. 常见 MySQL 语法兼容测试

MySQL 语法KingbaseES 是否兼容说明
CREATE TABLE ... AUTO_INCREMENT✅ 支持(转为序列)自动转化为 SERIAL
LIMIT offset, count✅ 完全兼容
SHOW TABLES✅ 兼容(伪命令)实际转为 \dt 或系统视图
REPLACE INTO❌ 部分不支持推荐使用 UPSERT 替代
IFNULL() 函数✅ 支持

💡 4. 案例实战一:建表、插入、查询、更新

-- 建表示例
CREATE TABLE user_info (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50),
  email VARCHAR(100),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入数据
INSERT INTO user_info (username, email) VALUES
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com');

-- 查询数据
SELECT * FROM user_info WHERE username LIKE '张%';

-- 更新数据
UPDATE user_info SET email = 'new_email@example.com' WHERE username = '李四';

-- 删除数据
DELETE FROM user_info WHERE id = 2;

🔁 5. 案例实战二:函数与存储过程迁移

MySQL 原始写法:

DELIMITER $$

CREATE PROCEDURE get_user_email(IN uid INT)
BEGIN
  SELECT email FROM user_info WHERE id = uid;
END$$

KingbaseES 改写(PL/pgSQL):

CREATE OR REPLACE FUNCTION get_user_email(uid INT)
RETURNS TEXT AS $$
DECLARE
  result TEXT;
BEGIN
  SELECT email INTO result FROM user_info WHERE id = uid;
  RETURN result;
END;
$$ LANGUAGE plpgsql;

🔍 兼容提示:KingbaseES 支持标准 PL/pgSQL,但不支持 MySQL 的 DELIMITER 等命令。


📥 6. 案例实战三:MySQL 数据迁移导入 KingbaseES

方法一:使用 mysqldump + iconv + psql

mysqldump -u root -p mydb --compatible=postgresql --default-character-set=utf8 > mydb.sql
iconv -f utf8 -t utf8 mydb.sql > mydb_pg.sql
psql -U kingbase -d kdbdb -f mydb_pg.sql

方法二:通过 CSV + COPY 导入

-- 先导出 MySQL 数据为 CSV
SELECT * INTO OUTFILE '/tmp/user.csv' FIELDS TERMINATED BY ',' FROM user_info;

-- KingbaseES 导入
COPY user_info FROM '/tmp/user.csv' DELIMITER ',' CSV;

🛠️ 7. 工具推荐与调优建议

  • ✅ 使用 Navicat Premium 或 DBeaver,可同时连接 MySQL 与 KingbaseES,方便迁移比对
  • ✅ 使用 OmniDB 统一管理 SQL 执行和调试
  • ✅ 推荐开启 log_statement = all 记录 SQL 兼容性问题

🧯 8. 常见问题排查

问题解决方法
MySQL SQL 报语法错误开启 kingbase_compatible_mode = 'MYSQL'
AUTO_INCREMENT 无效改为使用 SERIAL 或显示序列方式
函数参数顺序报错检查是否符合 PostgreSQL 参数顺序规范
迁移后中文乱码统一使用 UTF-8,避免混用 GBK
存储过程不执行检查是否使用了 MySQL 专属语法如 DELIMITER

✅ 9. 总结建议

  • KingbaseES 的 MySQL 兼容层对常用 DML/DDL/函数支持较好
  • 建议逐步替换存储过程、触发器为 PL/pgSQL 标准写法
  • 多表 JOIN、大事务处理可借助 PostgreSQL 的优化器性能提升
  • 可用 Flyway 等工具统一管理迁移脚本与多数据库版本

📎 参考资料