为什么要将我的数据库转换为UTF-8截断条目?

时间:2015-02-28 作者:SpencerDub

我正在运行WordPress 4.1.1。我的网站位于NearlyFreeSpeech。

自从WordPress博客将信息编码到latin1 字符集。本周,我意识到我博客上的某些帖子(如:1-2-3) 没有显示日语字符——这些字符要么显示为问号,要么显示为æ-¥अœèèèèèè等字符串。

显然,这是一个编码错误。查看phpMyAdmin中的数据库,我的数据库中有许多表和列,它们的排序规则设置为latin1_swedish_ci. 我试图通过以各种不同的方式将数据库更改为UTF-8来解决这个问题。他们都得到了完全相同的结果。

我尝试将数据库编码更改为UTF-8的方式:

使用UTF-8 Database Converter 插件遵循this guide 要导出数据库,请将“latin1”的所有实例替换为“UTF8”,使用SQL脚本将表和列转换为blob,然后转换为UTF-8文本(详细信息here)here)

Expected results:

我的网站看起来和上面一样,所有主题和设置都完好无损,但现在正确显示了日语字符。

Actual results for all of the above methods:

日语仍然不能正确显示。此外,数据库条目突然结束;例如,中的某些条目post_content 缺少部分或大部分原始内容。自定义短代码,由短代码器插件定义并存储在shortcoder_data 行输入wp_options, 因为shortcoder_data 条目被突然截断。我的主题选项(包括自定义CSS和字体)似乎已重置或损坏,很可能是由于数据库条目的类似突然截断。

幸运的是,我有远见在一个重复的数据库上进行所有这些更改,所以我有一个备份,所有数据都完好无损。

当我比较post_content 对于原文,我注意到了一点:几乎所有被截断的字符串都以一个特殊字符开头。例如,一篇曾经读过:

今天天气宜人,72度,阳光明媚。

将在修改后的数据库中读取:

今天是愉快的72

我还没有浏览并找到所有被截短的帖子——我对mySQL一无所知,所以我必须手工完成,这将是一种耐心的锻炼。然而,在8篇被截短的帖子中,有6篇明显是在一个特殊字符处被截短的。

我需要做些什么来正确转换数据库,以便正确显示日语字符,而不会导致数据丢失?或者,如果没有完整的解决方案,我可以做些什么来正确诊断发生了什么?

非常感谢。

Update: Extra information

还有一些事情。

我以前在我的博客上有很多帖子,上面都显示了一些字符串,比如™m而不是我,天真而不是天真。如上所述,日语显示为æ-¥अœèèèèèèèèèèèèèèèèèèèèèèè等长字符串,而不是日本語. 我在看到它们的地方穿过并替换了这些字符串,将Ã′替换为适当的ï(例如)。

然而,我并没有捕捉到所有的帖子,我的数据库中还有一些帖子仍然保持着“天真”,而不是“天真”。

当我看到我修改过的数据库上的帖子时。。。它们显示正确。它们不会截断。所有的乱码字符都被无缝地翻译成了它们的“正确”对应物。甚至日本人也改变了信仰。

然而,在我返回并“更正”乱码的帖子中,在我有天真和不天真的帖子中,数据库中的内容在导入时被截断,如上所述。

1 个回复
最合适的回答,由SO网友:SpencerDub 整理而成

问题是混合编码。一些字段包含正确编码为UTF-8的数据;其他文件包含编码为其他内容的数据,可能是ISO-8859-1。当导入到新的UTF-8数据库时,这会导致截断。

我的解决步骤是:复制原始数据库,wordpress, 到新数据库,wordpress2. 确保wordpress2 设置为UTF-8wordpress2 至UTF-8。这将导致截断wordpress 包含转换为UTF-8时的数据与转换为ASCII时的数据不同的条目,请更新中的相应行wordpress2 使用wordpress 数据,转换为UTF-8。下面是一个示例脚本

脚本:

UPDATE wordpress3.wp_options wp3
INNER JOIN wordpress.wp_options wp ON (wp.option_id = wp3.option_id 
    AND convert(wp.option_value using utf8) != convert(wp.option_value using ascii))
SET wp3.option_value = convert(wp.option_value using utf8);
一位知识更渊博的朋友为我写了一系列脚本information_schema 查找包含以下项目的所有列convert(value using utf8) != convert(value using ascii), 然后为他们生成上述脚本的版本。

结果:

成功了!在我的新数据库中,我可以保存日语,而不会将其变成问号(因为字符集已成功设置为UTF-8),并且所有导致数据截断的错误编码字段都已修复。

有些帖子包含misencoded字符,但由于我可以通过搜索–、Ã、或æ找到几乎所有这些字符串,所以我可以直接进入并手动替换它们。

结束

相关推荐

Overcome illegal characters

错误值:http://fonts.googleapis.com/css?family=Lato:100,300,regular,700,900|Open+Sans:300|Indie+Flower:regular|Oswald:300,regular,700&subset=latin,latin-ext 对于元素链接上的属性href:查询中的非法字符:不是URL代码点。如何解决上述错误以及为什么会发生此错误?