0

我有 Percona XtraDB 5.6 服务器,数据库非常旧,字符集设置为 utf8,数据以不同的字符集(可能是 latin1)编码。

我尝试将数据库迁移到新的 Percona 8.0 服务器,但在导入 SQL 文件后,8.0 服务器上的所有变音符号都损坏了。我已通过对每个表中的每一列执行此查询来解决该问题:

UPDATE table SET col = convert(cast(convert(col using latin1) as binary) using UTF8) WHERE 1;

但是有一张表,其中二进制数据(特别是 GZIP 压缩数据)保存到 LONGTEXT 列中。此列中的数据在导入新服务器后总是会损坏。

这是我到目前为止所尝试的:

  • 在转储之前将列类型更改为 LONGBLOB。
  • 使用上述查询在列类型更改之前/之后转换数据。

这是我用来导出数据库的命令:

mysqldump --events --routines --triggers --add-drop-database --hex-blob --opt --skip-comments --single-transaction --skip-set-charset --default-character-set=utf8 --databases "%s" > db.sql

请注意“--hex-blob”选项仍然会导致二进制数据导出为字符串,而不是十六进制。

4

1 回答 1

0

它不会被 zip/unzip 损坏。但它可能会以多种其他方式被损坏。

"--hex-blob" 将数据转换为字符串,这样在您重新加载它们之前它们不会被破坏。

转储、加载、插入、选择都需要被告知要使用什么字符集。

UPDATE你所做的事情可能会也可能不会让事情变得更糟。这是我已经确定的案例列表,以及最小的“修复”:

http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

于 2021-10-29T02:54:31.077 回答