具有错误字符集的MySQL数据库和具有二进制数据的LONGTEXT数据库



我有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
  • 使用上面的查询来转换列类型更改之前/之后的数据

这是我用来导出DB:的命令

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

请注意"--十六进制斑点";选项,仍然会导致二进制数据导出为字符串,而不是十六进制。

它不会被zip/unzip损坏。但它也可能受到其他多种方式的破坏。

&quot--十六进制斑点";将数据转换为字符串,以便它们在重新加载之前不会被损坏。

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

您所做的特定UPDATE可能会让情况变得更糟,也可能不会。以下是我已经确定的案例列表;fix":

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

最新更新