【问题标题】:Mysql data migration - wbcopytables charsetMysql数据迁移——wbcopytables charset
【发布时间】: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=utf8mb4collation=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


【解决方案1】:

我遇到了类似的问题,原来我的源数据库有 latin1 编码,但应用程序允许输入 UTF8 数据。不用说,这引起了问题。我必须将源数据库中的数据导出为 CSV,然后使用LOAD DATA LOCAL INFILE 代替指定的字符编码。例如

load data local infile 
'C:\\SentryLink Search\\Git\\WebApp\\sql\\data_subject_address_clean.csv'
replace into table subject_address 
character set latin1
fields terminated by ',' OPTIONALLY ENCLOSED BY '\''
escaped by '|'
lines terminated by '\n';

请注意,我使用管道字符 | 作为转义字符,因为它不太可能出现在数据中,也就是说,每隔一段时间会有一行有 |' 所以作为初步步骤必须得到使用 grep 或类似命令删除这些行或编辑它们。

我不能说它很有趣,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2013-09-14
    • 2014-04-10
    • 1970-01-01
    • 2014-10-26
    • 2013-11-12
    相关资源
    最近更新 更多