我的任务是将 Microsoft SQL Server 2005 数据库迁移到 MySQL 5.6(这些都是本地运行的数据库服务器),非常感谢一些帮助。
-MSSQL 源数据库有 latin1 排序规则(所以有 ISO 8859-1 字符集对吗?)但没有任何 char/varchar 字段(任何字符串字段都是 nvarchar/nchar)所以所有这些数据都应该使用 UCS-2 字符放。
-MySQL 目标数据库想要字符集 UTF-8
我决定在最新版本的 MySQL 工作台中使用数据库迁移工具包。起初它运行良好并按预期迁移了所有内容。但是在 MSSQL 数据库中遇到 UCS-2 代理对字符时,我完全被绊倒了。
迁移工具包可复制表程序没有提供非常有用的错误消息:“wstring 的字符集转换期间出错:没有错误”。它也没有提供有关导致问题的数据的任何字段/行信息,并且会在 100 行的块内失败。因此,在最后一次成功插入后搜索 100 行后,我发现问题似乎是由其中一个 nvarchar 字段中的两个 UCS-2 字符引起的。它们在 UCS-2 字符集中被列为代理项对。它们特别是字符 DBC0 和 DC83(我通过查看该字段的二进制数据并将字节对(小端序)与成功迁移的数据进行比较得到了这一点)。
当从 MSSQL 数据库中删除此代理对时,该行已成功迁移到 MySQL。
这是问题所在:
我试图在测试 MSSQL 表中搜索这些字符(这个图表表只是一个 nvarchar 字段的各种测试字符串)以准备替换脚本并不断得到奇怪的结果......我一定做错了。
正在寻找
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
将返回任何代理对字符(无论它是否使用 DC83),但显然,仅当它是该字段中唯一的字符(或该对的一部分)时。这没什么大不了的,因为无论如何我都想删除这些实例(我不喜欢删除这样的数据,但我认为我们负担得起)。
正在寻找
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
将返回每一行!无论字段中是否存在 unicode 字符,更不用说 DC83 字符了。有没有更好的方法来查找和替换这些字符?或者我应该尝试其他什么?
我还尝试将目标数据库、表和字段字符集设置为 UCS-2,但似乎没有什么区别。
我还应该提到,此迁移使用实时数据(约 50GB 数据库!),而其中一个提供它的站点已脱机,因此任何解决方案都需要快速运行...
我非常感谢任何建议!如果我遗漏了任何信息,请告诉我。