我的任务是将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代理对字符时,我完全被绊倒了.
迁移工具包copytable程序没有提供非常有用的错误消息:"在wstring的charset转换期间出错:没有错误".它也没有提供有关引起问题的数据的任何字段/行信息,并且会在100行的块内失败.因此,在最后一次成功插入后搜索了100行后,我发现问题似乎是由其中一个nvarchar字段中的两个UCS-2字符引起的.它们在UCS-2字符集中列为代理对.它们特别是字符DBC0和DC83(我通过查看字段的二进制数据并将字节对(little endian)与正在成功迁移的数据进行比较得到了这一点).
当从MSSQL数据库中删除此代理对时,该行已成功迁移到MySQL.
这是问题所在:
我试图在测试MSSQL表中搜索这些字符(这个chartest表只是各种测试字符串和nvarchar字段)来准备替换脚本并不断得到奇怪的结果......我必须做错误的事情.
正在寻找
SELECT * FROM chartest WHERE text LIKE NCHAR(0xdc83)
Run Code Online (Sandbox Code Playgroud)
将返回任何代理对字符(无论它是否使用DC83),但显然,只有它是该字段中唯一的字符(或对的一部分).这不是什么大问题,因为我想删除这些的任何实例(我不想删除这样的数据,但我认为我们可以负担得起).
正在寻找
SELECT * FROM chartest WHERE text LIKE '%' + (NCHAR(0xdc83))+ '%'
Run Code Online (Sandbox Code Playgroud)
将返回每一行!无论它是否在场中都有unicode字符,更不用说DC83字符了.有没有更好的方法来查找和替换这些字符?或者别的什么我应该尝试?
我也尝试将目标数据库,表格和字段字符集设置为UCS-2,但似乎没有什么区别.
我还要提一下,这次迁移是使用实时数据(~50GB数据库!),而其中一个提供它的网站是脱机的,因此任何解决方案都需要快速运行...
非常感谢任何建议!如果我遗漏了任何信息,请告诉我.