Wordpress 创建了 Collation Mess,现在从 MySQL8 开始无法读取它?

Wordpress created Collation Mess and is now unable to read it since MySQL8?

提问人:Soennchen 提问时间:10/20/2023 最后编辑:Holger JustSoennchen 更新时间:10/26/2023 访问量:62

问:

自 2009 年以来,我有一个 Wordpress 网站,目前它在整理中造成了真正的混乱。我得到了:

  • latin1_swedish_ci(我的网站上从来没有瑞典语单词?一切都是德语)
  • latin1_german2_ci
  • utf8mb3_general_ci
  • utf8mb3_unicode_ci
  • 甚至一些ascii_general_ci

现在一切都很好,直到 MySQL 8 出现。

由于变音符号现在被破坏了,我查看了我的数据库 - 发现它们也被“错误”存储。我猜我的 Wordpress 将 UTF-8 发送到某个 latin1 表中。

但直到现在,一切都很好。

因此,我尝试更新整个数据库排序规则 - 我认识到这不会影响单表排序规则。

当我尝试更改单个表排序规则时(我的想法是将它们全部更改 - 它给了我一个警告,字符可能会被更改 - 并且无法恢复。utf-8_mb4_general_ci

因此,我有点犹豫如何从这里开始。而且不确定。转换所有表中的排序规则可以解决问题吗?

我可以添加一个:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

到我的wpconfig

但是由于我在网站上有超过 1.000 个帖子,我感到非常恐惧,因为我搞砸了,之后不得不手动完成这一切。

此外,数据库中有 241 个表,因此可能需要一些时间逐个完成。

我的目标是再次在我的 WP 前端和后端正确显示变音符号 äöüß 等。

MySQL WordPress 字符编码 排序规则变 音符号

评论

2赞 wharfdale 10/20/2023
在继续之前,您是否在更改任何内容之前对数据库进行了备份。即使没有,现在也要服用一个,然后再继续。因此,您至少可以使用它的另一个副本,并在需要时降级到较旧的MySQL。
0赞 nbk 10/20/2023
在开始任何事情之前,请进行备份以在出现问题时恢复所有内容。通常,使用相同的字符集排序规则进行连接,获取所有数据,并使用 UTF8MB4 和 utf9mb4_unicode_ci 的第二个连接进行连接,并将数据发送到仅使用 UTF8MB4 字符集和相同排序规则的具有相同结构的表
0赞 Soennchen 10/20/2023
@wharfdale 是的,我做到了。感谢您的提及!(在我的主机上找到如何即时进行 sql 备份)。不幸的是,我认为降级到较旧的 mysql 是不可能的,因为对 sql 版本 5 的支持已经结束 - 而 8 现在是这个街区的新孩子。但是有了备份,我至少可以确定如果我完全搞砸了,我可以回去;-)(自从我使用 mysql dump 以来已经有 10 年了,但我可以再次弄清楚。
0赞 Soennchen 10/20/2023
@nbk我认为它应该如何工作(使用相同的字符集排序规则)来发送和存储。但就我而言,不幸的是,它没有。或者也许我真的没有得到你的答案?(很可能是这种情况;-))。
1赞 nbk 10/20/2023
根据您之前在备份中的WHQAT编写一个简单的Python脚本,该脚本具有TWIO连接和两种不同的字符集和排序规则,其余的就是简单的选择和插入,我推荐的大部分内容已经在页面上

答:

0赞 Ape-inago 10/20/2023 #1

我从 WordPress Codex 中找到了这个“转换数据库字符集”。对于早于 2010 年的网站,这种情况似乎正在发生。它似乎描述了您需要做什么来修复数据以获得适当的 utf8 支持。

一个关键部分脱颖而出:

在数据库字符集转换方面,每个站点都是不同的 [...] 如果您现在正在阅读本文,那么您可能必须手动执行此操作,因为自从 WP 更改其默认行为以来,为此目的编写的大多数插件都已停止工作。

以下是他们建议的技术的快速总结:

将列转换为 blob,然后使用新字符集将列转换回原始格式 [...] 解决方案是首先将所有包含文本的字段转换为其二进制(“BLOB”)对应数据类型(没有字符集),然后将它们更改回其正常数据类型以及所需的新字符集。

您可能还对其他讨论“请解释 WordPress 如何在低级别使用 MySQL 字符集和排序规则”和回复感兴趣。它提到了WP用来检测要使用的字符集的系统。这可能是故障所在。

似乎您不是唯一一个在MYSQL 8中遇到这种事情的人

祝你好运!我在试图帮助其他人使用他们旧帖子中出现的奇怪字符编码时发现了这一点,而不是专门针对 UTF8 支持,但这似乎是同样的棘手问题。

评论

0赞 Soennchen 10/20/2023
由于我是新手,我不能对你的答案投赞成票,但这就是我将尝试克隆我的数据库的方法。我现在找到了一个可行的解决方案(请参阅我的答案),但对于未来,我认为最好将其全部使用 UTF8。感谢您抽出宝贵时间,并得到详细而有用的回答!:-)干杯,万事如意!安德烈
0赞 Soennchen 10/20/2023 #2

我现在找到了一个可行的解决方案(在我的托管人支持的帮助下 - 他们真的很友善和乐于助人):

我们在我的wp-config中进行了更改

define('DB_CHARSET', 'utf8');

define('DB_CHARSET', 'latin1');

现在就这样了。我的网站再次工作,变音符号显示正确。

因此,现在我可以花一些时间将我的数据库的克隆“重新编码”为 UTF-8 - 因为我认为这将更符合未来。

感谢您的帮助!:-)

问候

安德烈