涵盖语法、数据、事务、性能、安全等多个维度,并附简要说明与案例:
一、SQL 语法与查询兼容性
-
方言差异
- 问题:不同数据库的 SQL 方言(如 MySQL 的
LIMIT
vs Oracle 的ROWNUM
)导致查询语法不兼容。 - 案例:MySQL 的
SELECT ... LIMIT 10
在 Oracle 中需改写为SELECT ... WHERE ROWNUM <= 10
。
- 问题:不同数据库的 SQL 方言(如 MySQL 的
-
函数与运算符不兼容
- 问题:字符串拼接(
||
vsCONCAT
)、日期函数(DATE_FORMAT
vsTO_CHAR
)等函数实现不同。 - 案例:PostgreSQL 的
||
拼接符在 MySQL 中需替换为CONCAT()
。
- 问题:字符串拼接(
-
子查询与 CTE 支持差异
- 问题:递归 CTE(如 PostgreSQL 支持但 MySQL 8.0 前不支持)或子查询优化差异。
- 案例:复杂递归查询在 MySQL 5.7 中需重写为存储过程。
二、数据类型与存储兼容性
-
类型映射冲突
- 问题:MySQL 的
TINYINT(1)
在 PostgreSQL 中可能被识别为SMALLINT
而非布尔类型。 - 案例:布尔字段迁移后需手动调整类型或数据转换。
- 问题:MySQL 的
-
精度与格式问题
- 问题:浮点数(
DECIMAL
vsNUMERIC
)、时间戳(带时区 vs 不带时区)精度差异。 - 案例:MySQL 的
DATETIME
迁移至 Oracle 时需处理时区偏移。
- 问题:浮点数(
-
字符集与编码差异
- 问题:UTF-8 与 GBK 编码不兼容,导致乱码或截断。
- 案例:中文数据从 MySQL(UTF-8)迁移至 SQL Server(默认 Latin1)时乱码。
三、事务与并发控制
-
隔离级别差异
- 问题:MySQL 默认
REPEATABLE READ
,而 PostgreSQL 默认READ COMMITTED
,可能导致幻读。 - 案例:迁移后事务行为不一致,需手动调整隔离级别。
- 问题:MySQL 默认
-
锁机制冲突
- 问题:行锁(如 MySQL 的间隙锁)与表锁(如 Oracle 的
FOR UPDATE
)实现不同。 - 案例:高并发场景下锁竞争加剧,导致死锁或性能下降。
- 问题:行锁(如 MySQL 的间隙锁)与表锁(如 Oracle 的
-
分布式事务支持
- 问题:XA 事务或两阶段提交在部分数据库中支持不完善。
- 案例:从支持分布式事务的数据库(如 Oracle)迁移至 MongoDB 时事务回滚失败。
四、架构与性能兼容性
-
索引优化失效
- 问题:B 树索引(MySQL)与哈希索引(MongoDB)无法直接迁移,查询性能暴跌。
- 案例:范围查询在哈希索引上性能下降 10 倍以上。
-
分片与分区策略
- 问题:水平分片(如 ShardingSphere)与垂直分区(如 MySQL 分区表)策略不兼容。
- 案例:分片键设计不一致导致数据倾斜或查询失败。
-
存储引擎差异
- 问题:InnoDB(支持事务)与 MyISAM(不支持事务)的存储引擎特性差异。
- 案例:迁移后事务性操作(如回滚)失效。
五、安全与权限模型
-
用户权限体系不兼容
- 问题:Oracle 的
ROLE
权限在 MySQL 中需逐项授权。 - 案例:迁移后需手动重新分配 100+ 用户权限。
- 问题:Oracle 的
-
加密与脱敏策略
- 问题:SQL Server 的 TDE 加密与 MySQL 的
keyring
插件不兼容。 - 案例:加密数据迁移后无法解密,导致业务中断。
- 问题:SQL Server 的 TDE 加密与 MySQL 的
-
审计与日志格式
- 问题:操作日志格式(如 JSON vs 文本)或审计策略差异。
- 案例:合规性审计因日志格式不兼容无法通过。
六、工具链与驱动问题
-
备份与恢复工具限制
- 问题:
mysqldump
导出的 SQL 文件在 PostgreSQL 中需语法转换。 - 案例:导出文件包含 MySQL 特定语法(如
ENGINE=InnoDB
),迁移后报错。
- 问题:
-
JDBC 驱动与 ORM 框架
- 问题:MyBatis 或 Hibernate 对新数据库驱动版本不兼容。
- 案例:升级驱动后
LocalDateTime
字段映射失败。
-
监控与告警工具
- 问题:Prometheus 监控指标(如 MySQL 特定指标)在 PostgreSQL 中不存在。
- 案例:监控面板因指标缺失无法展示数据库健康状态。
七、版本与功能差异
-
功能弃用与变更
- 问题:MySQL 8.0 移除
NO_AUTO_CREATE_USER
,旧应用权限配置失效。 - 案例:迁移后需手动修改 50+ 用户的权限配置。
- 问题:MySQL 8.0 移除
-
默认配置差异
- 问题:MySQL 5.7+ 默认启用
ONLY_FULL_GROUP_BY
,导致旧查询报错。 - 案例:迁移后需调整 200+ SQL 查询以符合新规则。
- 问题:MySQL 5.7+ 默认启用
八、云与分布式环境
-
多租户隔离冲突
- 问题:云数据库的实例级隔离与传统库的 Schema 级权限不兼容。
- 案例:迁移后多租户应用因权限模型差异无法隔离数据。
-
跨区域同步延迟
- 问题:分布式数据库的最终一致性违反原有事务假设。
- 案例:金融系统中跨区域事务因延迟导致对账失败。
Oracle迁移MySQL:PL/SQL存储过程语法不兼容,导致数百个金融计算逻辑需要人工重写,项目延期3个月。
SQL Server转PostgreSQL:TOP N语法在PostgreSQL中必须改为LIMIT,导致报表系统SQL批量报错。
MySQL 5.7升级8.0:默认字符集从latin1变为utf8mb4,导致部分历史数据乱码,业务系统显示异常。
MongoDB迁移DocumentDB:$lookup聚合查询在DocumentDB中性能下降10倍,拖慢实时分析系统。
SQLite切MySQL:自增ID在事务中的行为不一致,导致订单号重复,引发财务对账混乱。
Hive转Spark SQL:LATERAL VIEW explode在Spark中必须指定别名,ETL作业大面积失败。
DB2迁移Oracle:FETCH FIRST ROW ONLY语法不识别,紧急修改为ROWNUM = 1才恢复查询。
SQL Server到MySQL:DATETIME精度从毫秒级降为秒级,导致时间戳比对逻辑失效。
PostgreSQL切CockroachDB:SERIAL自增序列在分布式环境下出现冲突,主键重复插入报错。
SQL Server迁移Azure SQL:WITH (NOLOCK)提示被禁用,导致原有高并发查询全部死锁。
Oracle到国产数据库:CONNECT BY层级查询不被支持,组织架构树形展示功能瘫痪。
MySQL到TiDB:FULLTEXT全文索引语法差异,导致搜索功能失效,临时改用Elasticsearch补救。
SQL Server到PostgreSQL:PIVOT语法不兼容,财务交叉报表无法生成,手动重写成CROSSTAB。
MongoDB到Cosmos DB:$expr聚合表达式部分操作符不支持,业务逻辑被迫重构。
H2内存库切MySQL:MEMORY引擎表在MySQL中行为不同,应用启动后OOM崩溃。
SQLite到SQL Server:AUTOINCREMENT与IDENTITY机制冲突,导致主键插入失败。
MySQL到MariaDB:JSON_UNQUOTE默认行为变化,API返回数据意外带引号,移动端解析异常。
PostgreSQL到Redshift:ARRAY_AGG函数结果格式不同,BI工具图表渲染错误。
Oracle到MySQL:NVL函数必须改为IFNULL,数百个SQL脚本批量报错。
SQL Server到MySQL:ISNULL与IFNULL参数顺序相反,空值处理逻辑全部反转。
字符集转换灾难:GBK→UTF8迁移时4字节Emoji被截断,用户昵称批量变成"???",需手动修复20万条用户数据
分页语法陷阱:Oracle的ROWNUM迁移到MySQL的LIMIT时,原有复杂分页逻辑全失效,导致ERP系统列表页崩溃
事务隔离差异:SQL Server默认READ COMMITTED切到MySQL的REPEATABLE READ后,财务对账出现幻读导致金额不平
时区炸弹:云数据库UTC时间强制覆盖应用层时区配置,用户订单时间集体错乱8小时
自增ID冲突:SQLite迁移MySQL时未处理AUTOINCREMENT的预分配机制,引发主键重复插入
JSON解析灾难:PostgreSQL的jsonb迁移到MySQL的JSON类型后,嵌套查询语法失效,API返回500错误
空值语义反转:SQL Server的ISNULL切到Oracle的NVL时,空字符串处理逻辑错乱,客户地址信息丢失
驱动兼容雷区:JDBC连接TiDB使用MySQL驱动,部分预处理语句因协议差异返回错误结果集
隐式类型转换:Hive的STRING转Spark SQL的TIMESTAMP时,yyyy-MM-dd格式数据被误判为非法值
分布式事务坑:单体库切ShardingSphere后,跨库事务因XA协议不兼容导致订单状态与库存不一致