我有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损坏。但它也可能受到其他多种方式的破坏。
"--十六进制斑点";将数据转换为字符串,以便它们在重新加载之前不会被损坏。
转储、加载、插入、选择都需要被告知要使用什么字符集。
您所做的特定UPDATE
可能会让情况变得更糟,也可能不会。以下是我已经确定的案例列表;fix":
http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases