【发布时间】:2019-03-11 19:39:12
【问题描述】:
我用作源数据库的 PostgreSQL 实例使用 UTF-8 编码和 cp1252 字符集/排序规则。我正在尝试在我的目标数据库上使用 utf8mb4/utfmb4_unicode_520_ci 字符集/排序规则。我将所有相关的服务器/客户端字符集参数设置为 utf8mb4/utfmb4_unicode_520_ci 以确保正确读取数据。尽管如此,我仍然遇到大量错误,例如:
04:04:25 [INF][ copytable]: Statement execution failed: Incorrect string value: '\x92Angel...' for column 'user' at row 1:
...
04:04:21 [INF][ copytable]: Statement execution failed: Incorrect string value: '\xE1cs' for column 'lname' at row 1:
...
04:04:17 [INF][ copytable]: Statement execution failed: Incorrect string value: '\x85' for column 'user' at row 1:
...etc
我用于配置目标字符集/排序规则的字符串是这样的:
preInit=SET default_storage_engine=InnoDB,character_set_connection=utf8mb4,collation_connection=utf8mb4_unicode_520_ci,collation_server=utf8mb4_unicode_520_ci,character_set_server=utf8mb4
我怎样才能摆脱这些错误,或者至少忽略它们,以免它们停止整个表格其余部分的副本?在这一点上,我什至不在乎数据是否 100% 准确,我只想让它工作。
我已经尝试了我在这里阅读的所有内容,但没有任何问题。非常感谢任何帮助。
【问题讨论】:
-
utf8mb4 应该是什么? InnoDB 是一个 MySQL 的东西。您确定您的数据库系统没有混淆吗?
-
MySQL 的“utf8”字符集实际上不是 unicode,因为它最多只支持 3 字节字符。 Utf8mb4 是他们的解决方案。 InnoDB(在目标数据库字符串中)指的是来自 PostgreSQL 数据库的数据正在迁移到的 MySQL 数据库。我很确定我没有启动任何东西,因为迁移对某些表有效(尽管,只是因为它们显然不包含任何混乱的字符)。
-
啊,我明白了,这就是 mysql 的结束。道歉 - 我误读了您的问题,并认为您在询问 PostgreSQL。但是,错误中显示的那些代码对我来说看起来不像是有效的 UTF8。确保您将数据转储为 utf8 而不是 cp1252,如果您确定,请将其缩小到单个错误行,以便您可以转储正在使用的字符代码 + 获得正确的诊断
-
这正是我的想法——它根本不是有效的 UTF8。在第一个错误(不正确的字符串值:'\x92Angel...')中,完整的用户名是“D'Angelo”。 \x92 是 Unicode 中的“右单引号”。如果它正确读取为 utf8mb4,那么(理论上)应该没有错误。似乎由于某种原因,MySQL 工作台正试图将 Unicode 字符之后的字符计为额外字节(可能是因为它无法单独读取 \x92?)。
-
@xn -
\x92不是有效的 utf8 编码;它可能是 cp1252 中的引用。
标签: mysql postgresql mysql-workbench mysql-error-1064 utf8mb4