【发布时间】:2017-02-03 14:21:49
【问题描述】:
我正在尝试将一些数据从 MSSQL 移动到 MySQL。当我运行wbcopytables.exe 时,mysql 连接上的字符集似乎是错误的,当数据包含表情符号图标时出现错误(http://apps.timwhitlock.info/unicode/inspect?s=%F0%9F%8C%A8%E2%98%83%EF%B8%8F):
Incorrect string value: '\xF0\x9F\x8C\xA8\xE2\x98...' for column 'Value' at row 4
我的服务器、数据库、表和列有charset=utf8mb4 和collation=utf8mb4_unicode_ci。但是,我可以使用我在旁边创建的 .NET 应用程序将这些表情符号图标插入到该表中,因此这与架构/服务器设置无关。这让我觉得wbcopytables.exe 在连接上强制执行一些其他编码(可能是utf8)。我尝试更改所有 mysql 变量以强制执行 utf8mb4,如 my.ini 中的其他 SO 问题中所建议的那样:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET collation_connection = utf8mb4_unicode_ci'
skip-character-set-client-handshake
编辑:以下是有关 wbcopytables.exe 本身的更多信息:https://dev.mysql.com/doc/workbench/en/wbcopytables.html
【问题讨论】:
-
谁拥有
wbcopytables?它的文档在哪里? -
我已经更新了这个问题。
wbcopytables.exe是 MySQL Workbench 附带的 CMD 实用程序。 -
.NET 应用程序是您拥有源数据正确编码的唯一证据吗?您是否至少使用了
NVARCHAR列并将 SQL Server 连接编码设置为 Unicode?span> -
是的,这是唯一的证据。 MSSQL 具有 nvarchar 列。为什么对 mssql 连接进行编码很重要?在错误消息中,我可以看到我得到了代表表情符号的字节。我可以从.NET 插入相同的字节序列。问题出在mysql插入。
-
为什么源数据完整性很重要?因为迁移工具通常不是为了弄清楚如何修复坏数据而编写的。我并不是说数据是错误的,但鉴于它不起作用,它认为值得确定而不是仅仅猜测。
标签: mysql character-encoding data-migration