Microsoft SQL Server迁移MySQL时出现无对应解决方案的“数据过长”报错
问题成因
报错根本原因不是MySQL的nvarchar兼容bug,属于迁移流程的配置和类型映射问题,核心有三点:
- MySQL Workbench默认的SQL Server到MySQL类型映射规则存在缺陷:默认会将SQL Server侧的
nvarchar(MAX)类型映射为MySQL侧的varchar(255)/nvarchar(255),哪怕实际数据字符长度很短,只要单条数据的字节长度超出255就会触发报错。 - 字符编码的长度统计差异:SQL Server的
nvarchar按字符数统计长度,底层存储为UTF-16,迁移到MySQL时如果目标字符集为utf8mb4,单字符最多占4字节,迁移工具如果按字节长度而非字符数做校验,就会出现字符数少但字节数超出字段限制的情况。 - MySQL严格SQL模式的校验:默认开启的严格模式下,哪怕数据只超出字段长度1字节都会直接抛出截断错误,不会做自动截断兼容。
解决方案
按以下步骤操作即可解决报错完成迁移:
- 调整迁移工具的类型映射规则
在MySQL Workbench迁移向导的「Type Mapping」配置页,手动修改nvarchar(MAX)的全局映射规则,根据业务实际数据量选择映射为MySQL的VARCHAR(1000)、TEXT、MEDIUMTEXT类型即可,如果字段需要建索引,长度不要超过767字节(utf8mb4下对应191字符)。 - 优先手动创建目标表结构
不要依赖迁移工具自动生成表结构,提前从SQL Server导出表结构DDL,手动改写为MySQL兼容语法,明确指定所有字段的类型、长度、字符集为utf8mb4,排序规则按需设置,确认报错涉及的token、ActionTaken字段长度足够后,提前在目标MySQL实例完成建表,迁移时选择跳过表创建步骤,仅同步数据。 - 临时调整SQL模式降低校验强度
迁移开始前在目标MySQL实例执行命令:SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
迁移完成后再恢复为业务需要的SQL模式即可,避免严格校验导致的误报。 - 校验异常数据清洗无效字符
如果调整完上述配置仍有报错,从SQL Server提取报错行的对应字段值,检查是否存在不可见控制字符、多字节emoji或特殊符号,清理无效字符后再重新迁移即可。
迁移可行性说明
SQL Server到MySQL的迁移是完全可实现的,如果你最终要迁移到AWS托管的MySQL服务,更推荐使用AWS官方的DMS(数据库迁移服务)工具,适配性更强,支持全量+增量同步,能实现分钟级的业务停服切换,比MySQL Workbench更适合生产环境的迁移场景。
内容的提问来源于stack exchange,提问作者Codefun64
相关产品推荐
相关产品推荐

