一、常见SQL语法问题
- 分页查询语法 MySQL使用LIMIT offset, count,达梦更推荐或兼容Oracle的ROWNUM或FETCH FIRST子句。达梦8及以上版本支持LIMIT语法,但某些版本或特定模式下可能不支持,建议用ROWNUM改写成标准分页,或者使用FETCH FIRST语法,确保兼容性。
- 自增列与序列 MySQL的AUTO_INCREMENT在达梦中不直接支持,达梦通常使用序列(SEQUENCE)或IDENTITY列。迁移时需要将AUTO_INCREMENT转换为IDENTITY(如CREATE TABLE时定义IDENTITY(1,1))或通过触发器实现自增逻辑。
- 数据类型差异
- TINYINT、SMALLINT、MEDIUMINT等MySQL类型在达梦中可能不支持,需要映射为SMALLINT或INT。
- VARCHAR长度单位不同:MySQL中VARCHAR(n)按字符,达梦也按字符,但实际存储上限不同,迁移时注意超长字段。
- DATETIME、TIMESTAMP的精度和默认值行为不同,达梦对TIMESTAMP默认值要求更严格。
- BIT类型在达梦中可用,但部分驱动需要转成TINYINT或CHAR处理。
- 函数差异
- IFNULL在达梦中对应NVL或IFNULL(达梦兼容),但建议统一为NVL。
- GROUP_CONCAT在达梦中不存在,可改用LISTAGG。
- DATE_FORMAT在达梦中不支持,使用TO_CHAR配合日期格式。
- 字符串拼接:MySQL用CONCAT(),达梦支持CONCAT,也支持||,但部分版本对CONCAT多参数支持不同。
- SUBSTRING_INDEX在达梦中不支持,需用REGEXP_SUBSTR或自定义。
- 布尔类型:MySQL中TRUE/FALSE为1/0,达梦中可能不能用,需改用1/0或'Y'/'N'。
- 空值处理 MySQL中NULL排序、索引、唯一约束与达梦存在差异。达梦默认空值排序与Oracle一致,可能是末尾,而MySQL默认升序NULL在前(或在前取决于版本),迁移后查询结果可能改变。
- 表名和字段名 MySQL的表名和字段名区分大小写方式不同,达梦默认大小写敏感,但兼容模式可改变。迁移时最好统一使用大写,避免引用符导致找不到对象。
- 存储过程与触发器 PL/SQL语法与MySQL的存储过程语法差异大。达梦的存储过程更像Oracle:默认参数、游标、异常处理、动态SQL(EXECUTE IMMEDIATE)等都要从MySQL的DECLARE/CURSOR改写。触发器也有语法差异,特别是OLD/NEW引用的写法,达梦更接近Oracle的:NEW/:OLD。
- 字符集与排序规则 MySQL常用utf8mb4,达梦数据库的字符集在初始化实例时确定,迁移前需要检查字符集配置,避免乱码。排序规则如utf8mb4_general_ci在达梦中不存在,需要适配。
二、迁移方案建议
- 预处理评估:使用达梦提供的迁移工具(如DTS,达梦数据迁移工具)先做结构迁移和全量数据迁移的预检,对比SQL语句,生成不兼容项清单。
- 结构迁移:手动或通过工具将表结构、索引、约束、视图、存储过程、触发器逐一转换,优先处理AUTO_INCREMENT、数据类型映射、默认值表达式。
- SQL兼容模式:达梦支持兼容MySQL的语法模式,在创建数据库或会话时设置兼容参数,例如DM_COMPATIBLE_MODE或某些初始化参数,能在一定程度上减少部分语法改写,但不能完全依赖。
- 应用层改造:DAO层或SQL映射文件中,统一使用标准SQL或达梦兼容SQL。对于分页、日期格式化、字符串聚合等功能,通过数据库方言(Dialect)层适配。
- 数据迁移:使用DTS或编写脚本批量导数据,注意大批量数据提交事务大小、主键冲突、特殊字符转义,迁移后做数据量比对和数据一致性校验。
- 存储过程改写:按照PL/SQL规范重写存储过程,建议将复杂逻辑拆分,使用达梦的调试工具逐个验证。
- 测试验证:迁移完成后必须做全量回归测试,包括关键字冲突(如达梦中某些字段名是保留字)、索引失效、执行计划变化导致的性能问题。注意优化SQL,达梦的优化器特性与MySQL不同,需要重新调整索引策略。
三、实际操作中的经验 我最常遇到的坑是分页和自增列,很多系统报错都集中在LIMIT和AUTO_INCREMENT上。建议在项目初期就统一封装一个QueryBuilder,确保所有分页语句能根据数据库类型切换语法。另外,如果代码中包含大量内嵌SQL,建议先做SQL静态扫描,用正则或简单脚本找出LIMIT、IFNULL、GROUP_CONCAT等高风险关键词,再有针对性地改写。
迁移达梦是一个系统工程,并不只是改几个SQL语句。合理的顺序是先兼容性检查,再结构迁移,然后数据迁移,最后对应用层做持续调整。如果团队对Oracle语法熟悉,达梦的适配难度会低很多。最好在公司内部提前准备一套常见SQL转换对照表,作为团队参考文档。